System.AddIn в WCF - PullRequest
       13

System.AddIn в WCF

3 голосов
/ 18 июня 2009

У меня есть вопрос об использовании инфраструктуры 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. Прямой вызов работает нормально, но если я активирую AddIn из WCF, я получаю следующее исключение:

"Невозможно привести прозрачный прокси к типу 'ERES.ConversionService.Contract.IConversionContract'

Трассировка стека:

at ConversionHostViewToContractAdapter_ConstructorInvoker (Object) в System.AddIn.Hosting.AddInActivator.AdaptToHost [T] (конвейер AddInToken, IContract addInContract) в System.AddIn.Hosting.AddInActivator.ActivateInAppDomain [T] (конвейер AddInToken, домен AppDomain, контроллер AddInControllerImpl, логическое значение weOwn) в System.AddIn.Hosting.AddInActivator.Activate [T] (токен AddInToken, PermissionSet allowSet, строка 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 \ Мои документы \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService.BL \ BusinessLayer.cs: строка 44 в ERES.ConversionService.Service.Execute (Object toConvert, Operation Operation) в C: \ Documents and Settings \ kc \ Мои документы \ Visual Studio 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService \ Service.svc.cs: строка 25 в SyncInvokeExecute (Object, Object [], Object []) в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (экземпляр объекта, входы объекта [], объект [] и выходы) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & rpc)

Любая помощь?

С уважением Антон Калчик

UPDATE: Я смог обойти это с помощью этого кода:

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

Таким образом, в этом случае возможно только выполнение AddIn в том же AppDomain, что и для службы self. Но я не понимаю, почему?

1 Ответ

0 голосов
/ 04 января 2012

Глядя на то, где возникает ошибка, это когда надстройка адаптируется для хоста.

Проблема в том, что MEF пытается найти и привести к интерфейсу, который не может найти.

Ваши контрактные сборки находятся в том же месте, что и ваши сборки дополнений?

...