能否像在VS C++中一样从C# DLL导出函数?

43

在VS C/C++中,您可以使用extern "C" __declspec(dllexport) -function declaration-

我该如何在一个C#的dll中实现这个呢?是否有与上述代码等效的C#代码?

编辑:更多信息

我正在尝试为Notepad ++创建一个插件,并且我想使用C#,但到目前为止我看到的常见方法是使用旧的C++代码以及上述调用来导出几个Notepad ++ 要求导入和调用的函数。虽然有一个使用C#的示例应用程序,但仍需要一个加载器DLL,根据下面的注释/答案,我认为这是C#的唯一方式。

5个回答

39

Unmanaged Exports => https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

DLLExport => https://github.com/3F/DllExport

它是如何工作的?

创建一个新的类库或使用现有的类库,然后添加 UnmanagedExports Nuget 包

这就是所需的所有设置。

现在,您可以编写任何类型的静态方法,并用 [DllExport] 对其进行修饰,并从本地代码中使用它。它的工作方式与 DllImport 相同,因此您可以使用 MarshalAsAttribute 自定义参数/结果的编组。

在编译过程中,我的任务将修改 IL 以添加所需的导出项...


2
DllExports项目现在已经在GitHub上了(https://github.com/3F/DllExport)。 - R.J. Dunnill
在下载了3F/DllExport示例这里并尝试使用VS 2017 CE构建后,该工具由于某种原因未导出函数。希望这个问题能够找到解决方案。 - John Yost
我希望在使用CLR托管创建自己的内容之前,我能够看到这个。 - Jamie

20

我以前见过人们这样做,但需要使用ildasm,添加MSIL .export指令,然后重新组装。一个名为dll_tool的程序 可以为您完成这些步骤。

如果您想要构建一个混合模式DLL,其中包含本地和托管导出项,您应该使用专门为此目的设计的C++ / CLI。


你有一个小的 GitHub 演示项目来支持这个吗?或者你知道一些类似的项目吗? - serup

9
是的,可以像C++一样从C# dll中导出函数!您需要一些来自插件Unmanaged Exports (DllExport for .Net)的帮助来促进这个过程,或者使用类似的方法Exporting functions in C#/VB.NET to native code
请参见Code to Export C# DLL to Metatrader Build 600+,其中使用Robert Giesecke的C#项目模板进行非托管导出以将C# dll导出到与C ++非常相似的遗留应用程序(Metatrader)中的工作示例。
此外,您可能会发现Native and .NET Interopability有趣,尽管它主要是针对从.NET访问本机代码而不是反向操作。

2
现在有一个名为DNNE(即“用于.NET的本地导出”)的开源软件包,可以在此处找到:https://github.com/AaronRobinsonMSFT/DNNE
截至今天,它需要安装.NET6,但它也支持导出.NET Framework 4.8的.dll函数。

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接