我正在尝试在asp.net mvc2 app中测试mef和mefcontrib,但是我收到了一个错误:
Cannot cast the underlying exported value of type LoggerExtSys.Domain.WebLogger
(ContractName="LoggerExtSys.Domain.IWebLogger") to type LoggerExtSys.Domain.IWebLogger.
我的测试项目here
Global.asax中的代码:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
var catalog = new CatalogBuilder()
.ForAssembliesInDirectory(HttpRuntime.BinDirectory, "*ExtSys.dll")
.Build();
// Create interception configuration
var cfg = new InterceptionConfiguration()
.AddInterceptor(new StartableStrategy());
// Create the InterceptingCatalog with above configuration
var interceptingCatalog = new InterceptingCatalog(catalog, cfg);
// Create the container
var container = new CompositionContainer(interceptingCatalog);
// exception here
var barPart = container.GetExportedValue<IWebLogger>();
barPart.Debug("Test");
}
我尝试获取GetExportedValue
时出现例外情况 WebLogger中的代码:
[Export(typeof(IWebLogger))]
public class WebLogger : IWebLogger
{
#region IWebLogger Members
public void Debug(string str)
{
}
#endregion
#region ICoreExtension Members
public void Initialize()
{
}
#endregion
}
但在桌面应用程序中一切正常。 怎么解决?谢谢大家
答案 0 :(得分:2)
好的,问题出在加载程序集的代码块中:
public AggregateCatalog ForAssembliesInDirectory(string directory, string pattern)
{
IList<ComposablePartCatalog> _catalogs = new List<ComposablePartCatalog>();
var dir = new DirectoryInfo(directory);
Assembly assembly;
foreach (var file in dir.GetFiles(pattern))
{
assembly = Assembly.LoadFile(file.FullName);
_catalogs.Add(new AssemblyCatalog(assembly));
}
return new AggregateCatalog(_catalogs);
}
完成所有测试后,我将其删除并使用DirectoryCatalog。我不知道为什么,但它在桌面和网络应用程序中的工作。 谁会告诉我为什么我的旧代码无法在网络应用中运行将获得接受的答案和50赏金。感谢所有人
答案 1 :(得分:1)
我认为问题出在这里:
[Export(typeof(IWebLogger))]
public class WebLogger : IWebLogger
{
或处理类型引用和解析的方式。
我会尝试更改这一行:
var barPart = container.GetExportedValue<IWebLogger>();
成:
var barPart = container.GetExportedValue<WebLogger>();
或者您也可以尝试始终使用完全限定名称,这样不仅可以使用IWebLogger,还可以使用完整的命名空间。
你说这在基于Windows的应用程序中运行良好,你在该项目中引用了哪些程序集,或者你如何在那里写入Application_Start
事件处理程序的内容?你确定它完全一样吗?