代码之家  ›  专栏  ›  技术社区  ›  Tomas Vana

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

  •  4
  • Tomas Vana  · 技术社区  · 16 年前

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

    我已经了解到,不可能只加载一个程序集,然后在默认应用程序域中卸载它(我不能只保留两个版本的加载,因为这样我就会遇到 类型的重复定义 问题)

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

    你认为这是一个很好的方法/你有更好的想法/你能给我指出一些能让我开始工作的来源吗?

    非常感谢;

    3 回复  |  直到 16 年前
        1
  •  9
  •   RabtFt    11 年前

    尝试如下操作:

    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);
        }
    }
    

    并创建一个代理类(必须继承自 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);
        }
    }
    
        2
  •  0
  •   Oded    16 年前

    为什么不重写您的新库,以在不同的方法中使用旧版本的代码,并在需要时调用?

    public void MyNewMethod(){}
    
    public void MyLegacyMethod(){}
    
        3
  •  0
  •   Community Mohan Dere    9 年前

    purhaps您可以使用外部别名,请参见 what-use-is-the-aliases-property-of-assembly-references-in-visual-studio-8

    您应该能够为程序集的两个版本指定别名,并在代码中使用相同的前缀。

    推荐文章