1

背景
首先,我确实在别处寻找解决方案并找到了这个解决方案,但这并没有解决我的问题。

我在 Visual Studio 的主项目中引用了一个程序集,但我需要从我的项目外部加载它,而不是在子文件夹中。我可以通过调用加载程序集...

System.Reflection.Assembly.LoadFrom(myExternalAssemblyPath);

...但程序将无法运行并给我以下错误:

FileNotFoundException 未处理

无法加载文件或程序集“MyAssembly,Version=2.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。该系统找不到指定的文件。

在调用程序集之前我没有调用程序集来加载它,但是程序仍然希望,甚至在它Main显然进入函数之前,DLL 位于程序的文件夹中。

问题:
如何让我的程序在 Visual Studio 中仍然引用它,但在实际运行程序时从不同的位置加载它?我需要在某处指定一个指令来告诉程序等待加载它吗?还有其他解决方案吗?

注意:我不想将文件夹和 DLL 添加到 PATH 变量中。这不是一个可行的解决方案。

4

1 回答 1

3

诀窍是在您的应用程序域上实现AssemblyResolve事件。

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

在这里,您可以帮助运行时找到它尝试加载但使用默认搜索策略无法找到的程序集。这应该很简单,运行时将为每个缺少的程序集调用您的处理程序,您只需要自己从自定义路径加载它并从处理程序返回。

需要记住的重要一点:在 .NET 中,JIT 在调用方法之前将其完全处理(到本机代码中)。如果您的 Main 方法使用您尝试加载的程序集中的任何类型或方法,则它不会执行 Main。因此,Main 应该设置程序集加载。所有其他代码(尤其是与相关程序集相关的代码)必须移动到另一个方法,因此它会单独进行 JIT-ted。

于 2012-06-01T17:33:26.890 回答