如何在.NET中更改引用的加载路径?

时间:2009-04-30 10:59:10

标签: .net visual-studio dll reference

我想要这样的设置:

+- /ApplicationFolder
  -- App.exe
  -- Core.dll
  -- AnotherShared.dll
  +- /PluginsFolder
    -- plugin1.dll
    -- plugin2.dll

但是因为当我编译应用程序时,plugin1.dll引用了Core.dll和Shared.dll,所以它也会将“Copy.dll”和“Shared.dll”的副本丢弃到plugins文件夹中,如果我将它们删除则不会不再工作了。

我该如何解决这个问题?

3 个答案:

答案 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并使用该实例