39

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

如何在 C# dll 中完成此操作?是否有与上述代码等效的 C# 代码?

编辑:更多信息

我正在尝试为 Notepad++ 创建一个插件并且我想使用 C#,但到目前为止我看到的常见方法是使用带有上述调用的旧版 C++ 代码来导出 Notepad++ 期望导入的一些函数和称呼。有一个使用 C# 的示例应用程序,但这仍然需要一个加载器 DLL,我从下面的评论/答案中假设它是 C# 的唯一方法。

4

4 回答 4

37

非托管出口=> https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

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

它是如何工作的?

创建一个新的类库或继续现有的类库。然后添加 UnmanagedExports Nuget 包

这几乎是所需的所有设置。

现在您可以编写任何类型的静态方法,用本机代码装饰[DllExport]和使用它。
它的工作原理与 DllImport 类似,因此您可以使用MarshalAsAttribute.

在编译期间,我的任务将修改 IL 以添加所需的导出...

于 2012-08-01T09:53:24.883 回答
20

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

如果您想构建具有本机和托管导出的混合模式 DLL,您应该使用专门为此目的设计的 C++/CLI。

于 2011-01-27T16:24:09.640 回答
9

是的,可以以与 C++ 相同的方式从 C# dll 导出函数!您需要从促进此过程的加载项非托管导出 (DllExport for .Net)或类似方法(例如将C#/VB.NET 中的函数导出到本机代码)的帮助。

请参阅将 C# DLL 导出到 Metatrader Build 600+的代码,了解使用 Robert Giesecke 的用于非托管导出的 C# 项目模板将 C# dll 导出到与 C++ 非常相似的遗留应用程序 (Metatrader) 的工作示例。

此外,您可能会发现Native 和 .NET 互操作性很有趣,尽管它主要用于从 .NET 内部访问本机代码,而不是相反。

于 2014-05-12T20:10:31.360 回答
3

不,你不能像在 C 和 C++ 中那样做。

但是您可以创建 COM API 来实现您可以在 C 和 C++ 代码中使用的功能。

查看这些文章

于 2011-01-27T16:20:08.173 回答