如何将整数从 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[] 的正确方法

创建可以从 c# 和 c++ 中使用的 c# dll

嵌入式单声道:将数组从 C# DLL 返回/复制到 C++

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]

C# - 如何将 DLL 嵌入到项目中? [复制]