【问题标题】:mefcontrib interceptingCatalog export errormefcontrib 拦截目录导出错误
【发布时间】:2011-09-15 08:06:35
【问题描述】:

我正在尝试在 asp.net mvc2 应用程序中测试 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
    }

但在桌面应用程序中一切正常。 如何解决?谢谢大家

【问题讨论】:

  • 你把代码放在 Global.asax 的什么地方?在哪个方法里面?
  • @Davide Piras 嗨,感谢您的回复,我正在编辑我的代码块
  • 哪一行抛出异常?
  • @Davide Piras 我不明白为什么它在简单的 winform 应用程序上工作而不在 asp.net mvc 2 应用程序上工作((

标签: c# asp.net-mvc mef


【解决方案1】:

好的,问题出在加载程序集的代码块中:

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 赏金。谢谢大家

【讨论】:

    【解决方案2】:

    我认为问题出在这里:

    [Export(typeof(IWebLogger))]
    public class WebLogger : IWebLogger
    {
    

    或以您处理类型引用和解析的方式。

    我会尝试换行:

    var barPart = container.GetExportedValue<IWebLogger>();
    

    进入:

    var barPart = container.GetExportedValue<WebLogger>();
    

    或者您也可以尝试始终使用完全限定的名称,这样不仅 IWebLogger 还要将其完整的命名空间放在前面。

    您说这在基于 Windows 的应用程序中运行良好,您在该项目中引用了哪些程序集,或者您如何在其中写入 Application_Start 事件处理程序的内容?你确定完全一样吗?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多