gpt4 book ai didi

c# - MEF 和 ShadowCopying DLL,以便我可以在运行时覆盖它们

转载 作者:可可西里 更新时间:2023-11-01 08:50:04 24 4
gpt4 key购买 nike

我试图停止我的应用程序锁定我的 MEF 插件目录中的 DLL,以便我可以在运行时覆盖程序集(请注意,我实际上并没有试图让 MEF 在运行时重新加载它们,在下一个应用程序启动时很好,我只是不想停止应用程序来进行复制)

我正在尝试通过为我的 mef 加载程序集创建影子复制的应用程序域来做到这一点,如下所示:

[Serializable]
public class Composer:IComposer
{
private readonly string _pluginPath;
public Composer(IConfigurePluginDirectory pluginDirectoryConfig)
{
_pluginPath = pluginDirectoryConfig.Path;
var setup = new AppDomainSetup();
setup.ShadowCopyFiles = "true"; // really??? is bool not good enough for you?
var appDomain = AppDomain.CreateDomain(AppDomain.CurrentDomain.FriendlyName + "_PluginDomain", AppDomain.CurrentDomain.Evidence, setup);

appDomain.DoCallBack(new CrossAppDomainDelegate(DoWorkInShadowCopiedDomain));
}

private void DoWorkInShadowCopiedDomain()
{
// This work will happen in the shadow copied AppDomain.

var catalog = new AggregateCatalog();
var dc = new DirectoryCatalog(_pluginPath);
catalog.Catalogs.Add(dc);
Container = new CompositionContainer(catalog);
}

public CompositionContainer Container { get; private set; }
}

然后通过此类上的 CompositionContainer 访问我的 MEF 组件目录。然而,组合容器似乎只在 shadowcopy 域内初始化(这是有道理的),这意味着它在我的应用程序域中为 null。我只是想知道是否有更好的方法来执行此操作或某种跨域查询以获取我的 MEF 组件的方法

最佳答案

如果您不想遵循 Dan Bryant 和 zync 的解决方案,您可以创建一个 shell 应用程序,它只在新的 AppDomain 中执行您的应用程序。

一种方法是:

  1. 创建一个新的应用程序项目,它将成为 shell 应用程序。
  2. 在 shell 应用程序中,创建 AppDomain,启用卷影复制,如果需要,指定将启用卷影复制的目录。
  3. 使用AppDomain.ExecuteAssembly调用您当前的应用程序。

如果您有类库而不是应用程序,您可以尝试以下操作:

  1. 创建一个新的类库项目。
  2. 在新的类库项目中添加如下接口(interface):

    public interface IRemoteLoader  
    {
    void Load();
    void Unload();
    }
  3. 将此接口(interface)的实现添加到需要在新 AppDomain 中执行的类库中。在 LoadUnload 方法中,您应该添加代码来分别执行初始化和清理。使类派生自 MarshalByRefObject .这是 .NET Remoting 在两个 AppDomain 上创建代理对象所必需的。

  4. 创建新的 AppDomain 后,使用 CreateInstanceAndUnwrap从步骤 3 创建加载程序类的实例。

  5. 对第 4 步创建的对象使用 LoadUnload

如果您不进行细粒度控制并且简单地启动/停止就足够了。

关于c# - MEF 和 ShadowCopying DLL,以便我可以在运行时覆盖它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12593308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com