当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-10 12:30:38 C#

如何在AssemblyResolve事件之前在运行时加载程序集?实际上,我正在尝试在我的解决方案中实现某种“静态链接”程序集。所以我尝试了以下操作:执行这些步骤后,我得到了预期的FileNotFoundException。因此,让我们试试这个快速技巧,在AssemblyResolveEvent中加载一个程序集AppDomain.CurrentDomain.AssemblyResolve+=(sender,e)=>{返回我的程序集;};这行得通!我可以从AssemblyResolveEvent中的资源文件加载我的程序集。但是只有在其他任何地方都找不到我的组件时才会发生此事件。但是,在.Net尝试在不同位置进行搜索之前,如何加载我的程序集?由于检查了以前引用的程序集,我认为可以将程序集预加载到域中,这将被采用。我在program.csstaticvoidMain(){LoadMyAssemblies();中使用以下Main()方法进行了尝试。AppDomain.CurrentDomain.AssemblyResolve+=(sender,e)=>LoadMyAssemblies();Application.EnableVisualStyles();应用.SetCompatibleTextRenderingDefault(false);应用程序运行(新Form1());}privatestaticAssemblyLoadMyAssemblies(){程序集结果=AppDomain.CurrentDomain.Load(Properties.Resources.MyStaticAssembly);返回结果;但它仍然运行到InResolveEventHandler。更好的是,如果我再次加载程序集并查看AppDomain.CurrentDomain.GetAssemblies()我可以看到我的程序集被加载了两次!!那么为什么我的加载程序集在AssemblyResolve事件之前加载时没有被考虑在内的任何想法?在调试器的帮助下,当调用来自AssemblyResolve时,我也返回了一个空值,但在这种情况下,我得到了一个FileNotFoundException。如果您不知道,MSResearch有一个名为ILMerge的工具,可以将程序集合并到一个文件中。您还可以使用程序集链接器工具创建多文件程序集。另外回答你原来的问题,我认为问题是运行时不知道你手动加载的程序集是它应该寻找的那个。所以在程序集解析事件中,不是再次加载程序集,而是将引用传递回您手动加载的程序集。CLRBinder不知道LoadMyAssemblies()与AssemblyResolve事件做同样的事情,它们都试图找到相同的程序集并加载它。当Binder决定它已经搜索了所有可能的位置(可以搜索应用程序)并且找不到匹配项时,总是会触发AssemblyResolve事件。这就引出了最初的问题,即为什么要静态链接托管程序集?阅读此线程以获得关于此静态链接的优势的重要讨论我将继续并回答第1部分)将程序集放入GAC以了解如何避免遇到AssemblyResolve事件。就Binder而言,GAC总是赢家。2)将程序集放在探测路径中并确保Binder拾取它(有关详细信息,请查找MSDN上的文章“运行时如何定位程序集”)。以上就是C#学习教程:如何在AssemblyResolve事件之前在运行时加载程序集?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: