如何创建 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#
调用
步骤简述:
- 使用编译指示定义您的过程
{.stdcall,exportc,dynlib.}
- 用
--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
中查找这些宏。例如 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 文件来定义函数名称)。
我几乎阅读了通过 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#
步骤简述:
- 使用编译指示定义您的过程
{.stdcall,exportc,dynlib.}
- 用
--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
中查找这些宏。例如 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 文件来定义函数名称)。