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

ale*_*lex 3 c# dll assemblies system.reflection .net-assembly

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

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

这可能吗 ?

谢谢 !

Ron*_*dau 5

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

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

例如,如果您在名为“mydll.dll”的 dll 中具有类型“mytype”和方法“mymethod”,如果您使用它引用它,就像执行以下操作一样简单

new mytype().mymethod();
Run Code Online (Sandbox Code Playgroud)

如果您没有引用 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);
Run Code Online (Sandbox Code Playgroud)

此外,我们需要知道您想要实现什么,有一些方法可以使这变得更简单,但这取决于您的用例(例如,在插件系统中,您需要为插件声明一个接口并共享该 dll 和直接引用它,仅动态加载插件,因此您可以直接将实例转换为该接口,而不必动态调用方法)