2

微软与 C# 2012

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

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

4

2 回答 2

0

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

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

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

于 2013-06-26T14:40:21.537 回答
0

程序集解析器在其探测域中搜索 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"));
于 2013-06-26T15:03:12.540 回答