2009-06-18 2 views
3

У меня возник вопрос об использовании инфраструктуры AddIn, предоставляемой платформой .NET Framework (в настоящее время используется 3.5 SP1), реализованной в пространстве имен System.AddIn. Я создаю прототип с простой AddIn. Этот AddIn создается в бизнес-логике службы WCF.System.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); 
    } 
    ... 
} 

Я создал два испытания Unit. Один метод прямого вызова бизнес-логики, другой метод WCF. Прямой вызов работает отлично, но если я активировать AddIn из WCF я получаю это исключение:

«Невозможно бросить прозрачный прокси типа„“ERES.ConversionService.Contract.IConversionContract

Stack след:

в ConversionHostViewToContractAdapter_ConstructorInvoker (Object) в System.AddIn.Hosting.AddInActivator.AdaptToHost [T] (трубопровод AddInToken, IContract addInContract) в System.AddIn.Hosting.AddInActivator.ActivateInAppDomain [T] (трубопровод AddInToken, домен AppDomain, AddInControllerImpl CONTRO ller, Boolean weOwn) at System.AddIn.Hosting.AddInActivator.Activate [T] (AddInToken token, 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 \ Мои документы \ 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 Stud io 2008 \ Projects \ ConversionServiceSolution \ ERES.ConversionService \ Service.svc.cs: строка 25 в SyncInvokeExecute (объект, объект [], объект []) в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke (экземпляр объекта, объект [ ] входы, Object [] & выходов) на System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & Rpc)

помощь?

С уважением Антон Kalcik

UPDATE: я был в состоянии обойти это с этим кодом:

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

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

ответ

0

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

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

Являются ли ваши договорные сборки в том же месте, что и ваши монтажные сборки?

+0

Извините, но у меня больше нет кода, так как это был прототип и 2 года назад. Спасибо. –

Смежные вопросы