如何切换 .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 编译的另一个程序中使用