Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Cory NelsonОтветов: 1

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

appdomainremoting

Ответы

Ответ 1 · рейтинг 1 · Panos Rontogiannis

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы