运行时异常:找不到XXX类型
本文关键字:XXX 类型 找不到 异常 运行时 | 更新日期: 2023-09-27 18:19:56
MS VS C#2012
我开发了一个应用程序,它使用MEF来互连从数据库加载的几个二进制程序集。它的一个独立插件程序集依赖于第三方DLL,该DLL不能包含在主应用程序中。当我在主应用程序的引用中包括第三方dll时(插件也有引用),编译并运行它,应用程序就会顺利运行。但是,当我从主应用程序的引用中删除该DLL时(实际上我不需要它,我只需要在插件的项目中引用它),并使用AppDomain.CurrentDomain.AssemblyResolve事件从数据库加载第三方DLL程序集,它就会正常运行,但稍后在运行时,当插件尝试使用XXX类型(位于该第三方程序集中)时,应用程序会引发异常,抱怨在主程序集中找不到XXX类型。我被卡住了。
有人知道是什么原因造成的吗?任何合理的解释都将不胜感激。
尽管我很想看到一种更好的方法,但我的团队在一个使用MEF的项目中决定让其他引用第三方程序集的项目各自执行这样的构建后事件:
xcopy /Y /I /D "$(TargetDir)*.*" "$(SolutionDir)YourMainProjectNameHere'Bin'$(ConfigurationName)'"
当然,要想做到这一点,其他项目中的第三方引用也需要设置为"复制本地"。
程序集resovler在其探测域中搜索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"));