【问题标题】:Unable to load .NET assembly无法加载 .NET 程序集
【发布时间】:2012-01-10 22:43:54
【问题描述】:

我有以下情况:我有一个 Windows 服务,它使用 Microsoft AddIn 框架将许多外部 .dll 作为加载项加载。 AddIn .dll 各自位于“AddIns”目录内的各自目录中,该目录位于包含服务 exe 的目录中。每个 AddIn .dll 都引用一个公共程序集,该程序集基本上是 AddIns 的 API。我把它放在服务目录中。我遇到的问题是 API .dll 也必须在每个 AddIn 目录中,否则我会收到错误:

调用的目标已抛出异常。 - System.IO.FileNotFoundException:无法加载文件或程序集“OSAE.API,版本=1.0.0.0,文化=中性,PublicKeyToken=null”或其依赖项之一。系统找不到指定的文件。

我还尝试将此程序集添加到 GAC,它似乎将其放在 C:\Windows\Microsoft.NET\assembly\GAC_MSIL\OSAE.API\v4.0_1.0.0.0__f47a6446f36f79f7,但这似乎没有帮助。

如何让插件在特定目录中查找程序集,或者将其设置在全局可访问的位置?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    我解决了这个问题,将我的项目 target platform 从 Any Cpu 更改为 x86。此选项位于 Project > Properties > Build。更多信息请参考Microsoft's library BadImageFormatException

    【讨论】:

      【解决方案2】:

      为什么不在加载每个加载项 DLL 之前手动加载 API.dll。如果加载项 DLL 加载到它们自己的应用程序域中,那么您还必须将 API.dll 加载到每个应用程序域中。如果它们加载到同一个应用程序域中,那么您只需要加载一次 API.dll。

      【讨论】:

        【解决方案3】:

        我认为你的问题已经解决了:C# can't find assembly which is already loaded
        看看我的回答,我认为它也适合您的问题!

        【讨论】:

        • 谢谢。我能够使用您的其他回复来弄清楚如何在他们自己的应用程序域中打开每个插件。
        【解决方案4】:

        使用assembly binding log viewer (Fuslogvw.exe) 查看运行时尝试加载的内容以及失败的位置。

        程序集绑定日志查看器显示程序集绑定的详细信息。 此信息可帮助您诊断 .NET Framework 在运行时无法定位程序集的原因。 这些故障通常是由于程序集部署到错误位置、本机映像不再有效或版本号或文化不匹配。公共语言运行时找不到程序集通常会在您的应用程序中显示为 TypeLoadException。

        (强调我的)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-14
          • 1970-01-01
          • 1970-01-01
          • 2015-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多