[英]System.AddIn in WCF
我有一個關於使用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'類型
堆棧跟蹤:
在System.AddIn.Hosting.AddInActivator.AdaptToHost [T](AddInToken管道,IContract addInContract)的ConversionHostViewToContractAdapter_ConstructorInvoker(Object)處於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)的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:ERES.ConversionService.Service.E第44行 xecute(對象toConvert,操作操作)在C:\\ Documents and Settings \\ kc \\ My Documents \\ Visual Studio 2008 \\ Projects \\ ConversionServiceSolution \\ ERES.ConversionService \\ Service.svc.cs:第25行,在SyncInvokeExecute(Object,Object [],在System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc&rpc)的System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(對象實例,對象[]輸入,對象[]和輸出)中的Object [])
有幫助嗎?
關心安東卡爾奇克
更新:我能用這段代碼解決這個問題:
ConversionHostView view = token.Value.Activate<ConversionHostView>(AppDomain.CurrentDomain);
因此,在這種情況下,只能在與服務自身相同的AppDomain上執行AddIn。 但我不明白為什么?
查看錯誤發生的位置,就是在為主機調整插件時。
這里的問題是MEF試圖找到並轉換為它找不到的接口。
您的合同裝配是否與您的插件裝配在同一個位置?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.