我有一个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
原始异常被吃掉。
我确定问题最终导致其中一个导入的程序集没有更新,但我无法确定哪一个是违法者。