即使程序集位于同一目录中,也找不到程序集引用

时间:2010-09-21 15:41:42

标签: .net assembly-resolution fusion

我们目前正在为某些软件开发插件。我们决定在.NET中开发,即使应用程序是用某种母语编写的。由于在.NET中直接创建外部接口存在一些问题,我们决定在C ++ / CLI中构建一个桥接DLL,它进行一些基本的初始化,然后加载我们的托管程序集并从中创建一个用户控件。

在加载项.ini文件中,C ++ / CLI DLL按名称引用,因此应用程序将从那里加载它。但是,.NET DLL仅从C ++ / CLI DLL(作为托管引用)引用,因此导出的类型可用。在此设置中,howerver,应用程序崩溃加载.NET DLL。

我们很快发现我们可以订阅AppDomain.AssemblyResolve事件从C ++ / CLI DLL所在的同一目录加载.NET程序集,因此问题本身就解决了。

实际问题是:为什么加载程序找不到.NET DLL,即使它与引用它的程序集位于同一目录中?我一直希望加载程序集首先查看同一目录,而不是仅查看当前工作目录。为什么可执行文件在更改其工作目录时会找到程序集?如果通过加载C ++ / CLI程序集(而不是纯托管应用程序)调用CLR,情况会有所不同吗?

2 个答案:

答案 0 :(得分:4)

我建议您使用fuslogvw.exe来分析此类问题:

  

<强> Fuslogvw.exe and diagnosing .NET assembly binding issues

当然,还有用于分析未找到文件问题的通用工具:

  

Process Monitor

答案 1 :(得分:1)

当非托管EXE启动进程时,程序集的探测路径会变得有点不可预测。仅仅因为它加载了C ++ / CLI DLL,可能通过LoadLibrary或SetDllDirectory,以任何方式影响CLR的探测路径。

但那只是在猜测。当您查看Fuslogvw.exe生成的输出时,无需猜测。它向您显示正在探测的内容以及应用的策略。您可以使用app.exe.config文件(探测元素)或者通过AssemblyResolve修复此问题。