如何将整数从 C# 方法复制到本机 C DLL 函数
Posted
技术标签:
【中文标题】如何将整数从 C# 方法复制到本机 C DLL 函数【英文标题】:how to copy an integer from C# method to native C DLL function 【发布时间】:2013-10-04 14:04:35 【问题描述】:我想将一个整数从 C# 方法传递到本机 C DLL set_power(),但在 C# 调用 C 函数 set_power() 时出现运行时错误:“PInvokeStackImbalance”。
C# 声明:
[DllImport("Ultrasound_Frame_Grabber.dll")]
public static extern int set_power(int power_percent);
C#方法:
int target_power_percent = 123;
int new_value = set_power(target_power_percent); <<<<<<<<<<<<< GETS ERROR
原生 C DLL 函数:
__declspec(dllexport) int set_power( int power_percent )
...
【问题讨论】:
target_power_percent
的类型是什么?
你得到什么编译器错误?
你可以试试这里的***.com/questions/15339922/…,把double改成int。
啊哈。首先,这不是编译器错误,而是运行时错误。两种完全不同的东西。其次,您需要检查 C 编译器的默认调用约定。 CLR 默认为 stdcall,但许多 C 编译器默认为 cdecl,不匹配将产生您显示的运行时错误。
Raj 42:那行不通。
【参考方案1】:
在本机端使用stdcall
。
【讨论】:
我将 Visual-C# 项目道具 > 配置道具 > C/C++ > Adv > Calling Conv: 设置为 stdcall 并修复了它 按方法设置。您刚刚破坏了许多其他不相关方法的性能。不要对局部问题使用全局设置。【参考方案2】:你试过了吗:
public static extern Int32 set_power(Int32 power_percent);
编辑:
哦,还有:
[DllImport("Ultrasound_Frame_Grabber.dll", CallingConvention=CallingConvention.Cdecl)]
【讨论】:
以上是关于如何将整数从 C# 方法复制到本机 C DLL 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何从本机 C(++) DLL 调用 .NET (C#) 代码?
在 c# 中将 uchar[] 从本机 dll 编组为 byte[] 的正确方法