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

时间:2015-10-26 14:27:32

标签: c# dll dllimport ffi nim

我几乎阅读了我可以通过谷歌找到的每个例子,并且无法完成最简单的任务创建nim (windows) < strong>来自nim

有人可以一步一步解释吗?

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

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

使用command line \ dll,如何通过将以下代码编译为extern "C" __declspec(dllexport) int __stdcall return_multiply(int num1, int num2) { return num1 * num2; } 来获得相同的结果:

c#

您可能知道的代码可以从ffmpeg

调用

2 个答案:

答案 0 :(得分:6)

简而言之:

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

    请记住,您始终可以检查生成的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中查找这些宏。例如,对于Windows,N_LIB_EXPORT定义如下:

    #  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

答案 1 :(得分:1)

顺便说一句,看看Nim论坛中的这个帖子,看看你的32位版本无法正常工作的可能原因。

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

简短版本是MSVC在32位平台上对stdcall函数进行命名,除非您采取措施覆盖它(例如创建.DEF文件来定义函数名称)。