【发布时间】:2009-06-18 11:40:03
【问题描述】:
我有一个关于使用 AddIn 框架的问题,该框架由 System.AddIn 命名空间中实现的 .NET Framework(当前使用 3.5 SP1)提供。我用简单的 AddIn 构建了一个原型。此 AddIn 在 WCF Service 的业务逻辑中实例化。
业务逻辑的实现(只显示必要的代码):
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 控制器,Boolean weOwn) 在 System.AddIn.Hosting.AddInActivator.Activate[T](AddInToken 令牌,PermissionSet 权限集,字符串 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) 在 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:line 44 在 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(对象,对象 [],对象 []) 在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例,对象 [] 输入,对象 [] 和输出) 在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
有什么帮助吗?
问候 安东·卡尔奇克
更新: 我可以用这段代码解决这个问题:
ConversionHostView view = token.Value.Activate<ConversionHostView>(AppDomain.CurrentDomain);
所以在这种情况下,只能在与服务自身相同的 AppDomain 中执行 AddIn。但我不明白为什么?
【问题讨论】:
标签: c# .net wcf system.addin