MEF无法覆盖DirectoryCatalog文件。拒绝访问

时间:2011-10-18 12:41:22

标签: mef

我遇到MEF的问题,我有一个DirectoryCatalog,后来想要覆盖程序集并“刷新”目录。

我遇到的问题是该文件只是“正在使用”,我无法覆盖该文件。 Normaly你可以覆盖.Net程序集。

我认为MEF正在使用它,但这与重新编译有什么关系?!

这是我的代码示例。即使使用局部变量,文件仍在使用中。

我还尝试在应用程序和插件文件夹中安装程序集,但随后使用了app文件夹版本,因此覆盖并没有什么区别。

public RecompilationExample()
{
    DirectoryInfo dir = new DirectoryInfo(".\\plugin");

    if (!dir.Exists)
        dir.Create();

    DirectoryCatalog d; 
    CompositionContainer c;

    d = new DirectoryCatalog(".\\plugin");
    d.Changed += new EventHandler<ComposablePartCatalogChangeEventArgs>(d_Changed);

    c = new CompositionContainer(d);
    c.ExportsChanged += new EventHandler<ExportsChangeEventArgs>(c_ExportsChanged);
    c.ComposeParts(this);
}

1 个答案:

答案 0 :(得分:3)

  

Normaly你可以覆盖.Net程序集。

据我所知,没有。无法覆盖加载的.NET程序集。您也无法卸载已加载的程序集(除非卸载托管在其中的整个AppDomain)。

您可以做的是使用shadow copying,即复制程序集然后加载副本。您可以使用AppDomainSetup.ShadowCopyFiles属性启用此功能。这通常在ASP.NET中使用,允许您覆盖原始文件,但不会以影响正在运行的进程的方式覆盖 - 直到重新启动它。

另见this other answer我在回答类似问题时写的。简而言之:您可以动态使用DirectoryCatalog.Refresh 添加新程序集,但不能替换或删除它们。当您需要更换组件时,最佳解决方案是重新启动您的过程。