c# - WCF 中的 System.AddIn

标签 c# .net wcf system.addin

我有一个关于使用 AddIn 框架的问题,该框架由在 System.AddIn 命名空间中实现的 .NET Framework(目前使用 3.5 SP1)提供。我用简单的插件构建了一个原型(prototype)。此插件在 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(对象) 在 System.AddIn.Hosting.AddInActivator.AdaptToHost[T](AddInToken 管道,IContract addInContract) 在 System.AddIn.Hosting.AddInActivator.ActivateInAppDomain[T](AddInToken 管道、AppDomain 域、AddInControllerImpl Controller 、Boolean weOwn) 在 System.AddIn.Hosting.AddInActivator.Activate[T](AddInToken token 、PermissionSet 权限集、字符串 appDomainName) 在 System.AddIn.Hosting.AddInActivator.Activate[T](AddInToken token 、AddInSecurityLevel 级别、字符串 appDomainName) 在 System.AddIn.Hosting.AddInActivator.Activate[T](AddInToken token ,AddInSecurityLevel 级别) 在 System.AddIn.Hosting.AddInToken.Activate[T](AddInSecurityLevel trustLevel) 在 C:\Documents and Settings\kc\My Documents\Visual Studio 2008\Projects\ConversionServiceSolution\ERES.ConversionService.BL\BusinessLayer.cs 中的 ERES.ConversionService.BL.BusinessLayer.Execute(对象转换,操作操作):第 44 行 在 C:\Documents and Settings\kc\My Documents\Visual Studio 2008\Projects\ConversionServiceSolution\ERES.ConversionService\Service.svc.cs 中的 ERES.ConversionService.Service.Execute(Object toConvert, Operation 操作): 第 25 行 在 SyncInvokeExecute(对象,对象[],对象[]) 在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象实例、对象 [] 输入、对象 [] 和输出) 在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)

有什么帮助吗?

问候 安东·卡尔奇克

更新: 我可以用这段代码解决这个问题:

ConversionHostView view = token.Value.Activate<ConversionHostView>(AppDomain.CurrentDomain);

所以在这种情况下,只能在与服务自身相同的 AppDomain 中执行 AddIn。但我不明白为什么?

最佳答案

查看引发错误的位置,这是在为主机调整插件时。

这里的问题是 MEF 正在尝试查找并转换到它找不到的接口(interface)。

您的契约(Contract)程序集是否与插件程序集位于同一位置?

关于c# - WCF 中的 System.AddIn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1012205/

相关文章:

c# - 在 C# 中使用 foreach 循环时修改集合

c# - Dictionary <,> Size 、GetHashCode 和素数?

c# - 使用 LINQ "everywhere"时的性能问题?

c# - 如何获取后代类的属性值

c# - 如何避免 'Object reference not set to an instance of an object' ?

c# - 如何将 XML 文件转换为 MessageContract 类的实例?

c# - 无法在 IIS 中正确承载 WCF 服务。错误 404

c# - 对 WCF 行为扩展进行单元测试

c# - 像数字一样的顺序字符串

c# - 将 MDI 子菜单项合并到父菜单中