Controlling included assets from a package reference
Hi. I need to specify IncludeAssets="build;compile"
on one of my nuget package references. The DLL is resolved dynamically at runtime. Is this possible in LINQPad?
Comments
-
LINQPad doesn't use MSBuild and so ignores .props files and the build folder.
-
So is it not possible to achieve what I'm after? I can see in the assembly load context there is something called a 'ProbingSet' that has a link to the package version of the DLL. What is the 'ProbingSet', and can I manipulate it myself? I want a specific version of the DLL to be loaded (using an assembly resolver function) which lives in the installation directory of the application I'm trying to work with.
-
You can handle assembly resolution yourself as follows:
void Main() { } // LINQPad automatically calls the OnInit() method exactly once after the process has been created. void OnInit() { Util.AssemblyLoadContext.Resolving += (sender, args) => { if (string.Equals (args.Name, "foo", StringComparison.OrdinalIgnoreCase)) return Util.AssemblyLoadContext.LoadFromAssemblyPath ("....."); return null; }; Util.AssemblyLoadContext.ResolvingUnmanagedDll += (sender, args) => ... }
The Resolving event fires after the default assembly resolution has failed. It will only fire, however, as a result of the runtime trying to resolve an assembly, or a call to an assembly loading method that loads an assembly by name. If you have code that attempts to load an assembly from a specific path, and that path doesn't exist, that call will still throw.
Another workaround is to publish a separate convention-based NuGet package for the benefit of LINQPad and other similar tools, with the assemblies in the expected places:
lib{tfm}
ref{tfm}
runtimes{platform}-{architecture}\lib{framework}
runtimes{platform}-{architecture}\native -
Thanks Joe