我有一个关于使用AddIn框架的问题,该框架由System.AddIn命名空间中实现的.NET Framework(当前使用3.5 SP1)提供。我用简单的AddIn构建了一个原型。此AddIn在WCF服务的业务逻辑中实例化。

业务逻辑的实现(仅显示必要的代码):

internal class BusinessLayer : IBusinessLayer
{
    public object Execute(object toConvert, Operation operation)
    {
        IDictionary<string, AddInToken> tokens = AddIns.Store.GetAddInsTokens(@"c:\SomePathToStore");

        foreach (KeyValuePair<string, AddInToken> token in tokens)
        {
            if (operation.Name == token.Key && operation.Version == token.Value.Version)
            {
                ConversionHostView view = token.Value.Activate<ConversionHostView>(AddInSecurityLevel.FullTrust);

                object converted =  view.Convert(toConvert);

                AddInController.GetAddInController(view).Shutdown();

                return converted;
            }
        }

        throw new InvalidOperationException("No operation found!");
    }
    ...
}


服务的实现(仅显示必要的代码):

public class Service : IServiceContract
{
    IBusinessLayer bl;

    public Service()
    {
        bl = BL.BLFactory.GetBL();
    }

    public object Execute(object toConvert, ERES.ConversionService.Entity.Operation operation)
    {
        return bl.Execute(toConvert, operation);
    }
    ...
}


我创建了两个单元测试。一种是业务逻辑的直接方法,另一种是WCF方法。直接调用可以正常工作,但是如果我从WCF激活AddIn,则会出现以下异常:

“无法将透明代理强制转换为类型'ERES.ConversionService.Contract.IConversionContract'

堆栈跟踪:

在ConversionHostViewToContractAdapter_ConstructorInvoker(Object)
   在System.AddIn.Hosting.AddInActivator.AdaptToHost [T](AddInToken管道,IContract addInContract)
   在System.AddIn.Hosting.AddInActivator.ActivateInAppDomain [T](AddInToken管道,AppDomain域,AddInControllerImpl控制器,布尔值WeOwn)
   在System.AddIn.Hosting.AddInActivator.Activate [T]处(AddInToken令牌,PermissionSetPermissionSet,字符串appDomainName)
   在System.AddIn.Hosting.AddInActivator.Activate [T](AddInToken令牌,AddInSecurityLevel级别,字符串appDomainName)上
   在System.AddIn.Hosting.AddInActivator.Activate [T](AddInToken令牌,AddInSecurityLevel级别)上
   在System.AddIn.Hosting.AddInToken.Activate [T](AddInSecurityLevel trustLevel)处
   在C:\ Documents and Settings \ kc \ My Documents \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService.BL \ BusinessLayer.cs:line 44中的ERES.ConversionService.BL.BusinessLayer.Execute(Object toConvert,Operation operation)
   在C:\ Documents and Settings \ kc \ My Documents \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService \ Service.svc.cs:line 25中的ERES.ConversionService.Service.Execute(Object toConvert,Operation operation)中
   在SyncInvokeExecute(Object,Object [],Object [])
   在System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke处(对象实例,对象[]输入,对象[]&输出)
   在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc)

有什么帮助吗?

问候
安东·卡尔西克(Anton Kalcik)

更新:
我可以使用以下代码解决此问题:

ConversionHostView view = token.Value.Activate<ConversionHostView>(AppDomain.CurrentDomain);


因此,在这种情况下,只能在与服务自身相同的AppDomain上执行AddIn。但是我不明白为什么?

最佳答案

查看引发错误的位置,这是为主机修改插件的时间。

这里的问题是MEF试图查找并转换为它找不到的接口。

您的合同程序集与插件组件位于同一位置吗?

关于c# - WCF中的System.AddIn,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1012205/

10-11 02:02
查看更多