无法反序列化System.ComponentModel.Composition.CompositionException

时间:2017-09-25 21:15:25

标签: c# mef

我有一个MEF项目,它给我带来了我似乎无法追查的问题。它工作正常,直到我不得不更新一个似乎导致一切都破坏的项目文件。它正在抛出CompositionException,但由于包含MEF的对象位于另一个AppDomain中,我看到的实际上是:

  

System.Runtime.Serialization.SerializationException

     

用于反序列化类型为' System.ComponentModel.Composition.CompositionException'的对象的构造函数。没找到。

事实证明CompositionException并非(可)序列化,因此我没有机会弄清楚它的错误。有没有解决这个问题的方法?我已经无法将异常捕获到另一侧,以便我可以在那里看到它。

我所拥有的是这样的:

public class MyCollection
{
    private CompositionContainer _container;
    private AggregateCatalog catalog;
    private DirectoryCatalog dirCatalog;

    [ImportMany(AllowRecomposition = true, RequiredCreationPolicy = CreationPolicy.Shared)]
    public IEnumerable<Lazy<IItem, ItemInfo>> Items{ get; private set; }

    public MyCollection(string path)
    {
        catalog = new AggregateCatalog();
        dirCatalog = new DirectoryCatalog(searchPath);
        catalog.Catalogs.Add(dirCatalog);
        _container = new CompositionContainer(catalog);
        try
        {
            _container.ComposeParts(this);                
        }
        catch (CompositionException compositionException)
        {
            throw;    // Note: this does not get hit
        }

        // this is added just for debugging
        foreach (var s in Items)
        {
            try
            {
                System.Diagnostics.Debug.WriteLine($"{s.Metadata.Name} ({s.Metadata.Version}) is good!");
            }
            catch (System.ComponentModel.Composition.CompositionException)
            {
                // this never gets hit either
                System.Diagnostics.Debug.WriteLine($"{s.Metadata.Name} is bad!!!!");
            }
        }
        // end debugging
    }
}

我在AppDomain中创建MyCollection对象,如下所示:

var setup = new AppDomainSetup
{
    CachePath = cachePath,
    ShadowCopyFiles = "true",
    ShadowCopyDirectories = pluginPath
};

AppDomain domain = AppDomain.CreateDomain("Host_AppDomain", AppDomain.CurrentDomain.Evidence, setup);

var collection = domain.CreateInstanceAndUnwrap(
            typeof(MyCollection).Assembly.FullName,
            typeof(MyCollection).FullName, false, BindingFlags.Default, null, new object[] { pluginPath }, null, null) as MyCollection;

// everything is fine so far...

foreach (var s in collection.Items)   // fails on collection.Items
{
    // the loop is never entered
    Console.WriteLine($"{s.Metadata.Name} - {s.Metadata.Version}");
}

所以在我的代码中调用Items它失败了,尽管它是完全相同的循环,导致MyCollection内部没有问题,并且抛出SerializationException原始异常被吃掉。

我确定问题最终导致其中一个导入的程序集没有更新,但我无法确定哪一个是违法者。

0 个答案:

没有答案