2013-06-19 2 views
1

Я создаю AppDomain с другим ApplicationBase, а затем загружаю сборку из-за пределов этого ApplicationBase в домен.Исключение при передаче экземпляров между AppDomains с ApplicationBase

Создание экземпляра MarshalByRef из него с помощью CreateInstanceFromAndUnwrap работает очень хорошо, и я даже могу использовать этот тип - пока не попытаюсь передать экземпляр настраиваемого типа в качестве аргумента для него. Даже если this и аргумент взяты из той же самой сборки, я получаю это исключение:

System.ArgumentException: Object type cannot be converted to target type. 

Когда я не ставлю ApplicationBase проблема уходит. Но мне нужно это установить. Почему это происходит? Как я могу обойти эту проблему? Вот полный тест:

using System; 
using System.Linq; 

namespace adtest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AppDomainSetup ads = new AppDomainSetup 
      { 
       ApplicationBase = "C:\\", // just to have it be different. 
       ApplicationName = "test server" 
      }; 

      AppDomain ad = AppDomain.CreateDomain(
       ads.ApplicationName, null, ads); 

      ReverseFactory rf = (ReverseFactory)ad.CreateInstanceFromAndUnwrap(
       typeof(ReverseFactory).Assembly.Location, 
       typeof(ReverseFactory).FullName); 

      string res = rf.Reverse(
       new StringHolder("Hello from Bizarro Domain")); 

      Console.WriteLine(res); 
     } 
    } 

    public class ReverseFactory : MarshalByRefObject 
    { 
     public string Reverse(StringHolder s) 
     { 
      return new string(s.Value.Reverse().ToArray()); 
     } 
    } 

    public class StringHolder : MarshalByRefObject 
    { 
     public string Value { get; set; } 
     public StringHolder(string s) { Value = s; } 
    } 
} 

Когда я делаю StringHolder сериализуемые вместо MarshalByRef он работает. Тем не менее, мой реальный гораздо больший код, который представляет этот тест, не может использовать сериализуемый объект.

ответ

1

Из вашего примера кода Я понимаю, что вы хотите передать прокси-объект из основного AppDomain (StringHolder), в прокси-объект в дочернем приложении AppDomain (ReverseFactory). В то же время вы хотите, чтобы у двух AppDomains были разные базовые dirs.

Один из способов достижения этого - установка сборки на GAC. Вероятно, есть еще один способ справиться с этим, но на данный момент он ускользает от меня.

+0

Спасибо, вкладывая вещи в GAC, как я решил проблему. –

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

  • Нет связанных вопросов^_^