两个应用程序域加载相同版本的相同程序集

时间:2014-09-02 15:12:44

标签: c# reflection appdomain

如果我创建两个应用程序域并加载相同版本的同一程序集。他们会被区别对待/隔离吗?

我创建了一个名为DyTest的新程序集: -

using System;

namespace DyTest
{
    [Serializable]
    public sealed class Program
    {
        private static int _call = 0;
        public static int call()
        {
            _call += 1;
            return _call;
        }
    }
}

构建它并将其引用到控制台应用程序。并将其命名如下: -

static void Main(string[] args)
        {
            CreateDomainAndDisplayValue("test1");
            CreateDomainAndDisplayValue("test2");
            Console.ReadLine();
        }

        static void CreateDomainAndDisplayValue(string domainName)
        {
            AppDomainSetup domaininfo = new AppDomainSetup();
            domaininfo.ApplicationBase = "D:\\Test\\CN_TEST\\CN_TEST\\bin\\Debug\\";
            Evidence adevidence = AppDomain.CurrentDomain.Evidence;

            AppDomain domain = AppDomain.CreateDomain(domainName, adevidence, domaininfo);

            var t = (domain.CreateInstanceAndUnwrap("DyTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "DyTest.Program")).GetType();

            MethodInfo m = t.GetMethod("call");
            object obj = Activator.CreateInstance(t);
            Console.WriteLine((int)m.Invoke(obj, new object[] { }));
        }

现在test1正在返回1 现在test2正在返回2

因为变量_call是静态变量,所以这意味着我对应用程序域的理解不正确或者我错过了上面的内容。

我在期待 test1应返回1 test2应返回1

我可以通过AppDomain实现这一目标吗?

更新1 正如here所述,我更改了以下代码: -

using System;

namespace DyTest
{
    public sealed class Program : MarshalByRefObject
    {
        private static int _call = 0;
        public static int call()
        {
            _call += 1;
            return _call;
        }
    }
}

结果: - 现在test1返回1,test2`返回2

没有区别。

更新2 :得到了Eric关于此主题的答案的解决方案here

修改方法如下: -

static void CreateDomainAndDisplayValue(string domainName)
        {
            AppDomainSetup domaininfo = new AppDomainSetup();
            domaininfo.ApplicationBase = "D:\\Test\\CN_TEST\\CN_TEST\\bin\\Debug\\";
            Evidence adevidence = AppDomain.CurrentDomain.Evidence;

            AppDomain domain = AppDomain.CreateDomain(domainName, adevidence, domaininfo);

            DyTest.Program objInstance = domain.CreateInstanceAndUnwrap("DyTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", "DyTest.Program") as DyTest.Program;

            Console.WriteLine(objInstance.callFromEric());
        }

并且

using System;

namespace DyTest
{
    public sealed class Program : MarshalByRefObject
    {
        private static int _call = 0;
        public static int call()
        {
            _call += 1;
            return _call;
        }

        public int callFromEric()
        {
            return Program.call();
        }
    }
}

输出是 1 1

0 个答案:

没有答案