【问题标题】:Runtime exception: XXX type was not found运行时异常:未找到 XXX 类型
【发布时间】:2013-06-25 18:22:59
【问题描述】:

MS VS C# 2012

我开发了一个应用程序,它使用 MEF 来互连从数据库加载的多个二进制程序集。它的一个单独的插件程序集依赖于不能包含在主应用程序中的第三方 DLL。当我在主应用程序的引用中包含该第三方 dll 时(插件也有引用),编译并运行它,然后应用程序运行顺利。但是当我从主应用程序的引用中删除该 DLL 时(实际上我不需要它,我只需要在插件的项目中引用它)并使用 AppDomain.CurrentDomain.AssemblyResolve 事件加载来自数据库的第三方 DLL 程序集然后它运行正常,但后来,在运行时,当插件尝试使用 XXX 类型(位于该第三方程序集中)时,应用程序引发异常,抱怨它找不到 XXX 类型在主大会。我被卡住了。

有谁知道是什么原因造成的?任何理智的解释将不胜感激。

【问题讨论】:

标签: c# .net mef .net-assembly


【解决方案1】:

虽然我希望看到更好的方法,但我的团队在一个使用 MEF 的项目中决定让引用第三方程序集的其他项目每个都执行一个构建后事件,如下所示:

xcopy /Y /I /D "$(TargetDir)*.*" "$(SolutionDir)YourMainProjectNameHere\Bin\$(ConfigurationName)\" 

为此,当然,其他项目中的所述第三方引用也需要设置为“复制本地”。

【讨论】:

  • 使用/S 标志而不是*.* 作为源路径的一部分,您的里程也可能会有所不同。
【解决方案2】:

程序集解析器在其探测域中搜索 dll。这是默认的 GAC 和 Private Bin 文件夹。因此,如果您不想将第三方 dll 保留在主应用程序的 bin 文件夹中,那么您可以将这些第三方 dll 安装到 GAC 中。或者,如果您有可以找到这些 dll 的特定位置,则将该路径添加到探测域。

只需将此行放入您的配置文件中。

<!-- Adding custom folder of the Private bin to default probing domains -->
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="c:\plugins;"/>
  </assemblyBinding>
</runtime>

您也可以使用目录目录并指定放置第三方 dll 的位置。

var catalog = new AggregateCatalog(
  new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()), 
  new DirectoryCatalog("Extensions"));

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2013-07-01
    • 1970-01-01
    • 2017-05-28
    • 2012-07-08
    相关资源
    最近更新 更多