Исключение при передаче экземпляров между AppDomains с ApplicationBase

Я создаю AppDomain с другим ApplicationBase, а затем загружаю сборку из-за пределов этого 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, он работает. Однако мой реальный гораздо больший код, который представляет этот тест, не может использовать сериализуемый объект.


person Cory Nelson    schedule 19.06.2013    source источник


Ответы (1)


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

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

person Panos Rontogiannis    schedule 26.06.2013
comment
Спасибо, внесение вещей в GAC — это то, как я решил проблему. - person Cory Nelson; 09.09.2013