我想要这样的设置:
+- /ApplicationFolder
-- App.exe
-- Core.dll
-- AnotherShared.dll
+- /PluginsFolder
-- plugin1.dll
-- plugin2.dll
但是因为当我编译应用程序时,plugin1.dll引用了Core.dll和Shared.dll,所以它也会将“Copy.dll”和“Shared.dll”的副本丢弃到plugins文件夹中,如果我将它们删除则不会不再工作了。
我该如何解决这个问题?
答案 0 :(得分:5)
创建AppDomain时,您可以定义加载程序集的路径。设置AppDomainSetup.PrivateBinPath
并传递给AppDomain.Create域。
使用AppDomain是插件的好主意(允许不同的CAS和卸载)。
要避免VS / msbuild将引用的程序集复制到输出目录,请在引用的属性中将“Copy Local”更改为false。
答案 1 :(得分:1)
设置了我的MEF应用程序,以便插件项目编译到他们自己的文件夹(默认情况下),然后我使用post-build命令将特定文件复制到输出扩展文件夹。
另一种方法是将项目直接构建到相应的输出文件夹中,正如另一张海报所说,打开插件项目中每个相关引用的“属性”面板,并将“复制本地”设置为false。 / p>
答案 2 :(得分:1)
你可以试试这个:How can I set PrivateBinPath in MEF?
或者您可以尝试处理随时引发的Appdomain.AssemblyResolve事件.net无法找到程序集。在那里,您可以实现自定义逻辑,以便从任何地方定位和加载程序集。
AssemblyResolve eventhandler jsut返回正在寻找的程序集或null,因此您可以从AppDomain.GetAssemblies()方法返回已经加载的Core.dll。
但是在你的情况下,只要不包含带有plugin1.dll的Code.dll就可以了.net应该已经意识到已加载Core.dll并使用该实例