【问题标题】:How to change the loading path of references in .NET?如何更改 .NET 中引用的加载路径?
【发布时间】:2009-04-30 10:59:09
【问题描述】:

我想要这样的设置:

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

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

我该如何解决这个问题?

【问题讨论】:

    标签: .net visual-studio dll reference


    【解决方案1】:

    当您创建 AppDomain 时,您可以定义加载程序集的路径。设置AppDomainSetup.PrivateBinPath 并传递给AppDomain.Create domain。

    对于插件来说,使用 AppDomain 是个好主意(允许不同的 CAS 和卸载)。

    为避免 VS/msbuild 将引用的程序集复制到输出目录,请在引用的属性中将“复制本地”更改为 false。

    【讨论】:

    • 我正在使用 MEF,我将尝试弄清楚如何在 MEF 中执行此操作
    • 对于 MEF,方法会有所不同。未使用 MEF(尚未),但我认为您需要创建一个从不同文件夹加载的自定义目录。
    【解决方案2】:

    我的 MEF 应用程序已设置为将插件项目编译到它们自己的文件夹(默认情况下),然后我使用构建后命令将特定文件复制到输出扩展文件夹。

    另一种方法是将项目直接构建到适当的输出文件夹中,正如另一位海报所说,为插件项目中的每个相关引用打开“属性”面板,并将“复制本地”设置为 false。

    【讨论】:

      【解决方案3】:

      你可以试试这个:How can I set PrivateBinPath in MEF?

      或者您可以尝试处理任何时候引发的 Appdomain.AssemblyResolve 事件 .net 无法找到程序集。在那里您可以实现自定义逻辑以从任何地方定位和加载程序集。

      AssemblyResolve 事件处理程序 jsut 返回正在查找的程序集或 null,因此您可以从 AppDomain.GetAssemblies() 方法返回已加载的 Core.dll。

      但是,在您的情况下,只需不将 Code.dll 包含在 plugin1.dll 中就可以了,.net 应该已经意识到 Core.dll 已加载并使用该实例

      【讨论】:

        猜你喜欢
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-26
        相关资源
        最近更新 更多