背景的
首先,我确实在其他地方寻找解决方案并找到了this solution,但这并没有解决我的问题。
我在Visual Studio的主项目中引用了一个程序集,但我需要从项目外部加载它,而不是在子文件夹中加载它。我可以通过调用加载程序集......
System.Reflection.Assembly.LoadFrom(myExternalAssemblyPath);
...但程序无法运行并给我以下错误:
FileNotFoundException未处理
无法加载文件或程序集'MyAssembly,Version = 2.0.0.0, Culture = neutral,PublicKeyToken = null'或其依赖项之一。该 系统找不到指定的文件。
在调用加载它之前我没有调用程序集,但程序仍然期望,甚至在它显然进入Main
函数之前,DLL仍然在程序的文件夹中。
Quesiton:
如何使我的程序仍在Visual Studio中引用它,但在实际运行程序时从其他位置加载它?是否有指令我需要指定某个地方告诉程序等待加载它?还有其他解决方案吗?
注意:我不想将文件夹和DLL添加到PATH变量。这不是一个可行的解决方案。
答案 0 :(得分:3)
诀窍是在您的应用程序域上实现AssemblyResolve
事件。
http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx
这是帮助运行时找到它尝试加载但无法使用默认搜索策略查找的程序集的位置。这应该是直截了当的,运行时将为每个缺少的程序集调用你的处理程序,你只需要自己从自定义路径加载它并从处理程序返回。
要记住的重要一点:在.NET中,JIT在调用之前完全处理方法(到本机代码中)。如果您的Main方法使用您尝试加载的程序集中的任何类型或方法,则它将无法执行Main。因此,Main应仅设置程序集加载。所有其他代码(特别是与相关程序集相关的代码)必须移动到另一个方法,因此它会单独进行JIT。