使用ApplicationBase在AppDomains之间传递实例时出现异常

时间:2013-06-19 16:18:27

标签: .net remoting appdomain

我正在使用不同的AppDomain创建ApplicationBase,然后将此ApplicationBase外部的程序集加载到域中。

使用CreateInstanceFromAndUnwrap从中实例化MarshalByRef类型工作正常,我甚至可以使用该类型 - 直到我尝试将自定义类型的实例作为参数传递给它。即使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时,它可以工作。但是,我测试的实际大得多的代码不能使用可序列化的对象。

1 个答案:

答案 0 :(得分:1)

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

实现此目的的一种方法是将程序集安装到GAC。可能还有另一种方法可以解决这个问题,但目前它已经逃脱了我。