代码之家  ›  专栏  ›  技术社区  ›  OregonGhost

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

  •  0
  • OregonGhost  · 技术社区  · 14 年前

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

    在Advin .ini文件中,C++/CLI DLL被名称引用,因此应用程序将从那里加载它。然而,.NET DLL只是从c++/CLI DLL(作为托管引用)引用的,因此导出的类型是可用的。在这个设置中,howserver,应用程序加载.NET DLL时崩溃。

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

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

    2 回复  |  直到 14 年前
        1
  •  4
  •   Dirk Vollmar    14 年前

    我建议你用 fuslogvw.exe 分析此类问题:

    Fuslogvw.exe and diagnosing .NET assembly binding issues

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

    Process Monitor

        2
  •  1
  •   Hans Passant    14 年前

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

    但这只是猜测。当您查看fuslogvw.exe生成的输出时,不需要猜测。它确切地向您展示了正在调查的内容和应用的策略。您可以使用app.exe.config文件(探测元素)或通过assemblyresolve来修复此问题。

    推荐文章