我有一个关于使用AddIn框架的问题,由.NET Framework(目前使用3.5 SP1)提供,在System.AddIn命名空间中实现。我用简单的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令牌,PermissionSet permissionSet,String 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) at ERES.ConversionService.BL.BusinessLayer.Execute(Object toConvert,Operation operation)在C:\ Documents and Settings \ kc \ My Documents \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService.BL \ BusinessLayer.cs:第44行 at ERES.ConversionService.Service.Execute(Object toConvert,Operation operation)在C:\ Documents and Settings \ kc \ My Documents \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService \ Service.svc.cs:第25行 在SyncInvokeExecute(Object,Object [],Object []) 在System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例,对象[]输入,对象[]和输出) 在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&amp; rpc)
任何帮助?
此致 安东卡尔奇克
更新 我能用这段代码解决这个问题:
ConversionHostView view = token.Value.Activate<ConversionHostView>(AppDomain.CurrentDomain);
因此,在这种情况下,只能在与服务自身相同的AppDomain上执行AddIn。但我不明白为什么?
答案 0 :(得分:0)
查看错误发生的位置,就是在为主机调整插件时。
这里的问题是MEF正试图找到并投射到它找不到的界面。
您的合同装配是否与您的插件装配在同一个地方?