运行时异常:未找到XXX类型

时间:2013-06-25 18:22:59

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

MS VS C#2012

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

有谁知道是什么原因造成的?任何理智的解释都会非常感激。

2 个答案:

答案 0 :(得分:0)

虽然我希望看到一个更好的方法,但我的团队在使用MEF的项目中决定让其他参与第三方程序集的项目各自执行一个post build事件:

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

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

答案 1 :(得分:0)

程序集resovler在其探测域中搜索dll。这是默认的GAC和Private Bin文件夹。因此,如果您不想在主应用程序的bin文件夹中保留第三方dll,则可以将这些第三方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"));