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

Posted

技术标签:

【中文标题】如何切换 .NET 程序集以执行一种方法?【英文标题】:How can I switch .NET assembly for execution of one method? 【发布时间】:2010-01-20 09:37:51 【问题描述】:

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

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

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

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

非常感谢;)

【问题讨论】:

【参考方案1】:

试试这样的:

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

【讨论】:

谢谢你的例子,它对我有用,并从***.com/questions/2094487/…解决了我的问题 错字? “ApplicationProxy”应该是“RemoteProxy”,反之亦然?【参考方案2】:

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

public void MyNewMethod()

public void MyLegacyMethod()

【讨论】:

其实我对此并没有太多的控制权。我的方法根据库中的活动生成工作流图像,它需要加载正确版本的库才能工作..【参考方案3】:

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

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

【讨论】:

以上是关于如何切换 .NET 程序集以执行一种方法?的主要内容,如果未能解决你的问题,请参考以下文章

存储结果集以供以后获取

如何将图像转换为数据集以进行语义分割

Roslyn - 使用 CSharpCompilation 编译程序集以在 CSharpCompilation 编译的另一个程序中使用

编写 AT&T 程序集以使用奇偶校验标志和偏移量

.NET 发布者策略目标框架

程序集