如何创建一个nim dll并从c#中调用它

Avi*_*fer 11 c# dll ffi dllimport nim-lang

我看过几乎每一个例子,我可以通过谷歌找到,并不能完成任务的最简单的创建一个dll (窗口) nim

任何人都可以一步一步地解释它吗?

我正在使用nimIDE - aporia生成代码.

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

使用aporia IDE\ command line,如何通过编译下面的代码来实现与以下代码相同的结果dll:

extern "C" __declspec(dllexport) int __stdcall return_multiply(int num1, int num2)
{
    return num1 * num2;
}
Run Code Online (Sandbox Code Playgroud)

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

blu*_*e10 7

简而言之:

  1. 使用pragma定义你的proc {.stdcall,exportc,dynlib.}
  2. 编译 --app:lib

请记住,您始终可以检查生成的C代码以查看正在进行的操作.那么,让我们从包含以下内容的文件开始test.nim:

proc return_multiply(num1, num2: int): int {.stdcall,exportc,dynlib.} =
  num1 * num2
Run Code Online (Sandbox Code Playgroud)

编译它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;
}
Run Code Online (Sandbox Code Playgroud)

您可以在中查找这些宏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)
Run Code Online (Sandbox Code Playgroud)

总的来说,您最终会得到您给出的功能签名.

如果您不想使用命令行进行编译,则必须确定启用哪些Aporia设置--app:lib.