2009-06-18 35 views
3

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

实现:

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(对象) 在System.AddIn.Hosting.AddInActivator.AdaptToHost [T](AddInToken管道,IContract addInContract) 在System.AddIn.Hosting.AddInActivator.ActivateInAppDomain [T](AddInToken管道中,AppDomain域,AddInControllerImpl CONTRO (AddInSelectionLevel,布尔weOwn) at System.AddIn.Hosting.AddInActivator.Activate [T](AddInToken token,PermissionSet permissionSet,String appDomainName) at System.AddIn.Hosting.AddInActivator.Activate [T](AddInToken token,AddInSecurityLevel level,串appDomainName) 在System.AddIn.Hosting.AddInActivator.Activate [T](AddInToken令牌,AddInSecurityLevel电平) 在System.AddIn.Hosting.AddInToken.Activate [T](AddInSecurityLevel trustLevel) 在ERES.ConversionService.BL。在C:\ Documents and Settings \ kc \ My Documents \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService.BL \ BusinessLayer.cs中的BusinessLayer.Execute(Object toConvert,操作操作):第44行 位于ERES.ConversionService.Service 。在C:\ Documents and Settings \ kc \ My Documents \ Visual Stud中执行(Object toConvert,操作操作) io 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService \ Service.svc.cs:line 25 at SyncInvokeExecute(Object,Object [],Object []) at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance,Object [ ]输入,对象[] &输出) 在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc & RPC)

任何帮助?

问候 安东Kalcik

UPDATE: 我能够去解决这个使用此代码:

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

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

回答

0

看看错误发生在哪里,这是插件正在适应主机。

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

你的合约集会和你的插件集合在同一个地方吗?

+0

对不起,但我没有代码,因为它是一个原型和2年前。谢谢。 – 2012-01-04 15:38:35