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

4

1 回答 1

1

从您的示例代码中,我了解到您希望将代理对象从主 AppDomain () 传递给StringHolder子 AppDomain () 中的代理对象ReverseFactory。同时,您希望两个 AppDomain 具有不同的基本目录。

实现此目的的一种方法是将程序集安装到GAC. 可能有另一种方法来处理这个问题,但目前,它让我无法理解。

于 2013-06-26T10:15:29.353 回答