У меня есть вопрос об использовании инфраструктуры 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. Но я не понимаю, почему?