Home

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

Sign In or Register to comment.