Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在c语言中处理动态加载的托管库#_C#_.net_Plugins_Dll Injection - Fatal编程技术网

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

C# 如何在c语言中处理动态加载的托管库#,c#,.net,plugins,dll-injection,C#,.net,Plugins,Dll Injection,我用C#编写了一个应用程序,并为其添加了一种API。 使用此API,您可以将插件编写为dll,作为某些接口规则的基础 我想通过OpenFileDialog打开dll文件并使用其内容。 我的API是一个托管库,所以我只添加了一个引用,但我想在不知道dll文件名的情况下使用dll。命名空间也是每个库的另一个名称空间 如何加载dll并在其中运行代码?您所描述的通常称为插件系统。在谷歌上搜索“使用C#创建插件系统”之类的内容,可能会为您提供以下大量信息: 基本思想是: 定义程序实现的接口,以允许插件

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

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


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

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

基本思想是:

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

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

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


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

您可以使用从dll文件加载托管程序集(另请参见)

插件DLL是用.net语言编写的吗(比如C#)?如果是这样,它们将是托管库。是的,它们是.NET库,但它们是在运行时实现的,由“在运行时实现”,因此您的意思是希望在用户选择dll文件后加载它们并在其中运行方法?呃,“非托管”是什么意思在问题标题中是什么意思?这个问题让我们感到困惑,因为非托管dll意味着不是使用.net托管运行时创建的dll,这不是您的定义。我编辑了标题以更好地反映这个问题。“谷歌搜索…‘使用C#创建插件系统’…”-这就是我搜索的内容,但我无法像你那样表述它:)-另一个感谢,因为这为我提供了更多基本需要的功能。