Assembly/DLL 加载中

Assembly/DLL loading

我正在使用共享 DLL。在我的 Main() 中,我向 AppDomain.CurrentDomain.AssemblyResolve 添加了一个处理程序来加载 DLL。这适用于我的一些程序,其他程序甚至在使用 System.IO.FileNotFoundException 进入 Main() 之前就崩溃了(它找不到 DLL 文件)。

有人知道为什么我的一些程序在进入 Main() 之前尝试加载 DLL 而其他程序却没有吗?我必须更改什么以防止在到达 Main() 之前加载 DLL?

我已经复制了。正如所强调的,重要的是您提供 minimal, reproducible example.

它涉及一个 public 枚举 属性(在你的例子中是 Address.All)。当我部署这个程序并删除共享 DLL 时,它会在不调用我的事件处理程序的情况下抛出:

public class Program
{
    public static void Main(string[] args)
    {
        AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolveHandler;

        Console.WriteLine("In Main()");

        _ = new Foo();
    }

    private static Assembly AssemblyResolveHandler(object sender, ResolveEventArgs args)
    {
        throw new NotImplementedException("I'm afraid I can't do that, Dave.");
    }
}

public class Foo
{
    public Foo()
    {
        Console.WriteLine("In Foo constructor");
    }

    public SharedClassLibrary.SharedEnum Unused { get; set; }
}

共享 class 库仅包含以下内容:

namespace SharedClassLibrary
{
    public enum SharedEnum
    {
        Zero = 0,
        One = 1
    }
}

运行 这个没有共享 DLL 的程序甚至在进入 Main() 方法之前就抛出 FileNotFoundException 抱怨缺少 DLL。

所以解决方案是把程序集放在你的可执行文件旁边,我不知道你为什么要涉及你自己的程序集加载代码。

原因是 JIT,想知道 Main() 方法中使用的类型的所有信息。使用了此类型 Foo,为了实例化它,运行时必须了解有关 Foo 的所有信息,以便能够为实例分配内存。

Foo 的一部分是一个枚举,并且由于枚举可以继承自具有不同大小(一个字节或更多)的各种数字类型,运行时想要查找枚举的定义,因此必须加载组装.

解决方法是在新方法中实例化您的表单:

public static void Main(string[] args)
{
    AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolveHandler;

    Console.WriteLine("In Main()");

    RunApplication();
}

private static void RunApplication()
{
    _ = new Foo();
    // or in your case, Application.Run(new MainForm());
}

这表明我的自定义程序集解析器被命中:

In Main()

Unhandled exception. System.IO.FileLoadException: Could not load file or assembly 'SharedClassLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. Not implemented (0x80004001 (E_NOTIMPL)) File name: 'SharedClassLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'

---> System.NotImplementedException: I'm afraid I can't do that, Dave.