【问题标题】:How to handle dynamically loaded managed libraries in c#如何在 C# 中处理动态加载的托管库
【发布时间】:2012-09-24 14:52:30
【问题描述】:

我用 C# 编写了一个应用程序,并为它添加了一种 API。 使用此 API,您可以将插件编写为 dll,它是一些接口规则的基础。

我想让通过 OpenFileDialog 打开 dll 文件并使用其内容成为可能。 我的 API 是一个托管库,所以我只是添加了一个引用,但我想在不知道 dll 文件名称的情况下使用 dll。此外,命名空间是另一个每个库。

如何加载 dll 并在其中运行代码?

【问题讨论】:

  • 插件 dll 是用 .net 语言(如 C#)编写的吗?如果是这样,它们将是托管库。
  • 是的,它们是 .NET 库,但它们是在运行时实现的
  • “在运行时实现”是指在用户选择 dll 文件后加载它们并运行其中的方法?
  • Erm,那么问题标题中的“NON-Managed”是什么意思?
  • 这个问题让我们感到困惑,因为非托管 dll 是指不是使用 .net 托管运行时创建的 dll,这不是您的定义。我已经编辑了标题以更好地反映问题。

标签: c# .net plugins dll-injection


【解决方案1】:

您所描述的通常称为插件系统。搜索“使用 C# 创建插件系统”之类的内容可能会为您提供大量信息,如下所示:

http://www.codeproject.com/Articles/4691/Plugin-Architecture-using-C

基本思路是:

  • 定义您的程序实现的接口,以允许插件从您的程序中获取信息。
  • 定义一个所有插件都将实现的接口,以允许您的程序调用插件的方法来执行某些操作。
  • 将这些接口放入您的程序和任何插件 dll 引用的单独 dll 中。
  • 提供某种方式来查找具有实现插件接口的类型的 dll,例如你的 OpenFileDialog。
  • 加载 dll 并查找实现插件接口的类型(使用反射)。
  • 使用反射实例化这些类型。
  • 酌情通过接口调用这些类型的方法。

关于托管/非托管。托管 DLL 是使用 .net 托管运行时构建/编码的。这将是用 .net 语言编码的东西,例如

非托管 dll 或多或少是用不同语言编码的任何东西。

您所说的非托管 dll 我将其称为动态加载的托管 dll。 IE。它仍然是一个托管 dll(以 .net 语言编码),但在程序已经运行之前不会加载。

【讨论】:

  • “谷歌搜索...'使用 C# 创建插件系统'...” - 这就是我搜索的内容,但我无法像你那样制定它:) - 还有另一个谢谢,因为这为我提供了我基本需要的更多功能。
【解决方案2】:

您可以使用 Assembly.LoadFrom Method (String) 从 dll 文件加载托管程序集(另请参阅 Best Practices for Assembly Loading)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2017-10-30
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多