У меня возник вопрос об использовании инфраструктуры 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, как самообслуживание. Но я не понимаю, почему?
Извините, но у меня больше нет кода, так как это был прототип и 2 года назад. Спасибо. –