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