我有一种情况,我在不同文件夹中有几个.dll文件,所有文件名都相同,包含相同的功能(名称相同),但是同名函数内的代码不同。
我在设计中创建了我的应用程序,引用了其中一个.dll文件。 但是我想在我的应用程序启动时,使用select case来更改对这些dll之一的引用。
这可能吗?
谢谢!
答案 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并直接引用它,只动态加载插件,所以你可以直接将实例转换为该接口,而不必动态调用方法)