C# 拒绝坏DLL';她和MEF在一起

C# 拒绝坏DLL';她和MEF在一起,c#,dynamic,dll,plugins,mef,C#,Dynamic,Dll,Plugins,Mef,我正试图利用插件和MEF设计一个可扩展的GUI应用程序 现在,大部分工作似乎正在按计划进行。然而,在某些情况下,我会有一个坏的DLL,它不符合我设计的契约。我希望能够告诉MEF忽略坏的DLL,并将其他所有内容保留在该目录中。有没有办法做到这一点(最好不删除坏的DLL) 我读了一些书,注意到调用dirCatalog.Parts.ToArray()将帮助我捕获先前添加坏DLL时抛出的ReflectionTypeLoadException,以便我有时间处理它(在将其添加到容器之前)。虽然这有助于调试,

我正试图利用插件和MEF设计一个可扩展的GUI应用程序

现在,大部分工作似乎正在按计划进行。然而,在某些情况下,我会有一个坏的DLL,它不符合我设计的契约。我希望能够告诉MEF忽略坏的DLL,并将其他所有内容保留在该目录中。有没有办法做到这一点(最好不删除坏的DLL)

我读了一些书,注意到调用
dirCatalog.Parts.ToArray()
将帮助我捕获先前添加坏DLL时抛出的
ReflectionTypeLoadException
,以便我有时间处理它(在将其添加到容器之前)。虽然这有助于调试,但我不想因为一个坏的DLL而使程序崩溃,也不想加载整个目录

下面是我想出的一些(未完成的)代码

private void appendToCatalog(DirectoryInfo rootDirInfo)
{
    if (rootDirInfo.Exists)
    {
        DirectoryCatalog dirCatalog = new DirectoryCatalog(rootDirInfo.FullName, Constants.Strings.PLUGIN_EXTENSION);

        try
        {
            // detect a problem with the catalog
            dirCatalog.Parts.ToArray();
        }
        catch (ReflectionTypeLoadException ex)
        {
            // try to remove bad plugins
            filterBadPlugins(dirCatalog);
        }

        catalog.Catalogs.Add(dirCatalog);
    }
}

private void filterBadPlugins(DirectoryCatalog dirCatalog)
{
    foreach (var part in dirCatalog.Parts)
    {
        // This should narrow down the problem to a single part
        Type t = part.GetType(); 
        // need to remove the part here somehow
    }
}

最终,这是我的解决方案。这并不理想,但似乎有效。我将过滤方法与append方法连接起来

private void appendToCatalog(DirectoryTreeNode node)
{
    DirectoryInfo info = node.Info;
    FileInfo[] dlls = info.GetFiles("*.dll");

    foreach (FileInfo fileInfo in dlls)
    {
        try
        {
            var ac = new AssemblyCatalog(Assembly.LoadFile(fileInfo.FullName));
            ac.Parts.ToArray(); // throws exception if DLL is bad
            catalog.Catalogs.Add(ac);
        }
        catch
        {
            // some error handling of your choice
        }
    }
}