如何切换.NET程序集以执行一种方法?

Tom*_*ana 4 .net c# asp.net assemblies appdomain

我的.NET应用程序有不同版本的dll,大多数时候我想使用最新版本的dll.但是,有一种方法我在一个单独的线程上运行,我需要能够根据某些条件选择较旧版本的dll.

我已经知道不可能只加载一个程序集然后在默认的应用程序域中卸载它(我不能只保持两个版本都加载,因为那时我遇到了类型问题的重复定义)

可能我必须创建一个单独的AppDomain,在那里加载程序集然后卸载它.此应用程序域将在单独的线程上执行一个方法,并且可以使用该库的不同版本.

你认为这是一个好方法/你有更好的想法/你能指出一些能让我入手的资源吗?

非常感谢 ;)

Rub*_*ias 9

尝试这样的事情:

class Program
{
    static void Main(string[] args)
    {
        System.Type activator = typeof(ApplicationProxy);
        AppDomain domain = 
            AppDomain.CreateDomain(
                "friendly name", null,
                new AppDomainSetup()
                {
                    ApplicationName = "application name"
                });

        ApplicationProxy proxy = 
            domain.CreateInstanceAndUnwrap(
                Assembly.GetAssembly(activator).FullName,
                activator.ToString()) as ApplicationProxy;

        proxy.DoSomething();

        AppDomain.Unload(domain);
    }
}
Run Code Online (Sandbox Code Playgroud)

并创建一个代理类(必须继承MarshalByRefObject)

class ApplicationProxy : MarshalByRefObject
{
    public void DoSomething()
    {
        Assembly oldVersion = Assembly.Load(new AssemblyName()
        {
            CodeBase = @"c:\yourfullpath\AssemblyFile.dll"
        });

        Type yourOldClass = oldVersion.GetType("namespace.class");
        // this is an example: your need to correctly define parameters below
        yourOldClass.InvokeMember("OldMethod", 
                                   BindingFlags.Public, null, null, null);
    }
}
Run Code Online (Sandbox Code Playgroud)