如何在c#中处理动态加载的托管库

时间:2012-09-24 14:52:30

标签: c# .net plugins dll-injection

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

我希望能够通过OpenFileDialog打开dll文件并使用其内容。 我的API是一个托管库,所以我只是添加一个引用,但我想在不知道dll文件名的情况下使用dll。命名空间也是另一个库。

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

2 个答案:

答案 0 :(得分:4)

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

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

基本理念是:

  • 定义程序实现的接口,以允许插件从程序中获取信息。
  • 定义所有插件将实现的接口,以允许程序调用插件的方法来执行某些操作。
  • 将这些接口放在一个单独的dll中,该dll由程序和任何插件dll引用。
  • 提供一些查找dll的方法,其中包含实现插件界面的类型,例如:你的OpenFileDialog。
  • 加载dll并查找实现插件界面的类型(使用反射)。
  • 使用反射实现这些类型。
  • 根据需要通过界面调用这些类型的方法。

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

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

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

答案 1 :(得分:1)

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