我已经阅读了几乎所有可以通过google找到的示例,并且无法完成最简单的任务dll 创建nim (Windows)

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

我正在使用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#调用

最佳答案

简而言之,请执行以下步骤:

  • 使用编译指示{.stdcall,exportc,dynlib.}
  • 定义您的proc
  • 使用--app:lib编译


  • 请记住,您始终可以检查生成的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

    关于c# - 如何创建一个Nim dll并从C#调用它,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33348222/

    10-13 07:32
    查看更多