我正在创建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 时,它可以工作。但是,我这个测试代表的实际更大的代码不能使用可序列化的对象。