在运行时动态更改对dll的引用

时间:2015-05-24 04:57:59

标签: c# dll assemblies .net-assembly system.reflection

我有一种情况,我在不同文件夹中有几个.dll文件,所有文件名都相同,包含相同的功能(名称相同),但是同名函数内的代码不同。

我在设计中创建了我的应用程序,引用了其中一个.dll文件。 但是我想在我的应用程序启动时,使用select case来更改对这些dll之一的引用。

这可能吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

你不能这样做,如果你想使用你在运行时选择的一个dll,你需要从你的项目中直接引用它(在运行时无法更改)开始,然后手动加载它你的appdomain使用Assembly.Load并反思它使用它的类型(因为你不知道编译时的类型,因为它没有被引用,所以你必须根据你查询的类型对它进行编程)。

因此,如果你已经针对引用的dll进行了编程,那么你做错了,因为如果你需要它是动态的,那么使用代码的整个方式就不同了。

例如,如果你在一个名为“mydll.dll”的dll中有一个带有“mymethod”方法的类型“mytype”,如果你用它来引用它就像做

一样简单
new mytype().mymethod();

如果您没有引用dll但是动态解析它,它将看起来像

var asm = Assembly.Load("mydll.dll");
var type = asm.DefinedTypes.Single(t=>t.Name == "mytype");
var instance = Activator.CreateInstance(type);
var methodinfo = type.GetMethod("mymethod");
methodinfo.Invoke(instance);

此外,我们需要知道您要实现的目标,有一些方法可以使这更简单,但这取决于您的用例(例如,在插件系统中,您为插件声明了一个接口并分享那个dll并直接引用它,只动态加载插件,所以你可以直接将实例转换为该接口,而不必动态调用方法)