如何创建 nim dll 并从 C# 调用它

How to create a nim dll and call it from c#

我几乎阅读了通过 google 找到的所有示例,但无法完成最简单的任务 创建 dll (windows) nim

谁能一步一步解释一下?

我正在使用 nim IDE - aporia 生成代码。

构建 dll 是否需要使用命令行?我想有一个解决方法。

使用 aporia IDE \ command line,如何获得与将下面的代码编译为 dll:

相同的结果
extern "C" __declspec(dllexport) int __stdcall return_multiply(int num1, int num2)
{
    return num1 * num2;
}

您可能知道的代码可以从 c#

调用

步骤简述:

  1. 使用编译指示定义您的过程 {.stdcall,exportc,dynlib.}
  2. --app:lib
  3. 编译

请记住,您始终可以检查生成的 C 代码以了解发生了什么。因此,让我们从一个文件 test.nim 开始,其中包含:

proc return_multiply(num1, num2: int): int {.stdcall,exportc,dynlib.} =
  num1 * num2

使用 nim c --app:lib -d:release test.nim 编译生成 DLL 以及此代码(在 nimcache 文件夹中):

N_LIB_EXPORT N_STDCALL(NI, return_multiply)(NI num1, NI num2) {
        NI result;
        result = 0;
        result = (NI)(num1 * num2);
        return result;
}

您可以在 nimbase.h 中查找这些宏。例如 N_LIB_EXPORT 对 Windows 的定义如下:

#  ifdef __cplusplus
#    define N_LIB_EXPORT  extern "C" __declspec(dllexport)
#  else
#    define N_LIB_EXPORT  extern __declspec(dllexport)
#  endif
#  define N_LIB_IMPORT  extern __declspec(dllimport)

总的来说,您最终会得到与您提供的函数签名完全相同的结果。

如果你不想使用命令行编译,你必须弄清楚哪些 Aporia 设置启用 --app:lib

顺便说一下,看看 Nim 论坛上的这个帖子,了解您的 32 位版本无法正常工作的可能原因。

http://forum.nim-lang.org/t/1721

简而言之,MSVC 会在 32 位平台上对 stdcall 函数进行名称重整,除非您采取措施来覆盖它(例如创建 .DEF 文件来定义函数名称)。