簡體   English   中英

WCF中的System.AddIn

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM