繁体   English   中英

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

[英]Dynamically change the reference to a dll at runtime

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

我在设计中创建了我的应用程序,引用了这些 .dll 文件之一。 但我希望在我的应用程序启动时,使用选择案例能够更改对这些 dll 之一的引用。

这可能吗 ?

谢谢 !

你不能这样做,如果你想使用你在运行时选择的 dll,你需要先不直接在你的项目中引用它(在运行时不能改变),然后使用手动将它加载到你的应用程序域中Assembly.Load 并对其进行反思以使用它的类型(因为您在编译时不知道类型,因为它没有被引用,所以您必须针对您查询的类型对其进行编程)。

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

例如,如果您在名为“mydll.dll”的 dll 中有一个类型“mytype”和一个方法“mymethod”,如果您使用它来引用它就像做一样简单

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 和直接引用它,只动态加载插件,所以你可以直接将实例转换为该接口,而不必动态调用方法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM