我有一个关于使用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服务自我。但我不明白为什么?
对不起,但我没有代码,因为它是一个原型和2年前。谢谢。 – 2012-01-04 15:38:35