【问题标题】:Dynamically change the reference to a dll at runtime在运行时动态更改对 dll 的引用
【发布时间】:2015-05-24 04:57:59
【问题描述】:

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

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

这可能吗?

谢谢!

【问题讨论】:

  • 按照描述,这听起来类似于基于插件的架构,你在看类似的东西吗?

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


【解决方案1】:

你不能这样做,如果你想使用在运行时选择的 dll,你需要首先在你的项目中不直接引用它(在运行时不能更改)然后手动加载它您的 appdomain 使用 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并直接引用它,仅动态加载插件,因此您可以直接将实例转换为该接口,而不必动态调用方法)

【讨论】:

  • 我正在尝试解决我在这里提出的其他问题之一:stackoverflow.com/questions/30405626。但由于我没有得到这个问题的任何答案,我认为如果我得到这个问题的解决方案,我可以解决这个问题。
  • 如果 smo 库既不向后也不向上兼容,那么你需要做我在我的回答中提出的几乎是的。你确定不是吗? (不能简单地将旧版本用于新版本吗?)
  • 不,他们不是。但是用你的idea好像不是很适合用。 ,因为我确切地知道每个 dll 文件中的类型、函数名称和所有内容都是相同的。实际上我找到了这个链接,但我不知道如何在我的情况下使用:blog.slaks.net/2013-12-25/redirecting-assembly-loads-at-runtime。你有什么想法吗?
  • @RonanThibaudau 当您提到插件案例时,接口是否位于主机和插件都引用的第三个程序集中?如果不是,转换到界面如何工作?
  • @xr280xr 是的,您可以将带有接口的 dll 发送给开发人员,以便他们可以编写实现它的插件,然后您可以扫描预定文件夹中包含实现该接口的类的 dll 和从那里去
猜你喜欢
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-02
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多