如何在AssemblyResolve事件之前在运行时加载程序集?

Oli*_*ver 11 c# assemblies .net-3.5

实际上我试图在我的解决方案中实现某种"静态链接"程序集.所以我尝试了以下内容:

  • 使用CopyLocal = false添加对程序集的引用
  • 使用"添加为链接"将.dll文件本身添加到我的解决方案中
  • 使用"添加资源" - "添加现有文件"将.dll文件本身添加到我的资源
  • 将我的程序集中的某些类型添加到Form1中 private MyObject temp = new MyObject();

在这些步骤之后,我按预期得到了FileNotFoundException.因此,让我们尝试使用此快速入侵在AssemblyResolveEvent中加载程序集

AppDomain.CurrentDomain.AssemblyResolve += (sender, e) =>
    {
        Assembly MyAssembly = AppDomain.CurrentDomain.Load(Properties.Resources.ExternalAssembly);
        return MyAssembly;
    };
Run Code Online (Sandbox Code Playgroud)

这样可行!我可以从AssemblyResolveEvent中的资源文件加载我的程序集.但是这个事件只会发生,如果它无法在其他任何地方找到我的组件.但是我怎么能 .Net尝试搜索不同的地方之前加载我的程序集?

由于检查先前引用的程序集的事实,我认为可以预先将程序集加载到域中,这将被采用.

我在program.cs中使用以下Main()方法尝试了这个

static void Main()
{
    LoadMyAssemblies();
    AppDomain.CurrentDomain.AssemblyResolve += (sender, e) => LoadMyAssemblies();
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

private static Assembly LoadMyAssemblies()
{
    Assembly result = AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

但它仍会运行到ResolveEventHandler中.更好的是,如果我再次加载程序集并查看AppDomain.CurrentDomain.GetAssemblies()我可以看到我的程序集加载了两次!!

所以任何想法为什么加载程序集在AssemblyResolve事件之前加载时不会被考虑在内?在调试器的帮助下,当调用来自AssemblyResolve时,我也返回了null,但是在这种情况下,我在开头时得到了一个FileNotFoundException.

Sij*_*jin 3

以防万一您不知道,MS Research 提供了一种名为ILMerge 的工具,可以将程序集合并到一个文件中。

您还可以使用程序集链接器工具创建多文件程序集。

另外,为了回答您最初的问题,我认为问题是运行时不知道您手动加载的程序集是它应该寻找的程序集。因此,在程序集解析事件中,只需将引用传回您手动加载的程序集,而不是再次加载程序集。