c# - C# - 使用 ref 调用 C++ DLL 函数
问题描述
我正在尝试从我的 C# 代码中调用 C++ 中的 DLL 函数。
DLL函数代码和结构(C++):
typedef struct{
Operacion RespuestaOperacion;
char var1[256];
int var2;
char var3[33];
char var4[1025];
char var5[20];
char var6[11];
char var7[7];
} TResultado;
typedef void (WINAPI *TPROC_PAY_VENTA)(long Importe, bool ProcessMessages, TResultado *Resultado);
我的 C# 代码:
[StructLayout(LayoutKind.Sequential)]
public struct TResultado
{
public Operacion RespuestaOperacion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
public string var1;
public int var2;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
public string var3;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1025)]
public string var4;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string var5;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 11)]
public string var6;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 7)]
public string var7;
}
[DllImport("DLLName.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Pay_Venta(long importe, bool ProcessMessages, ref TResultado Resultado);
TResultado Resultado = new TResultado();
long cent = 1;
CRPayIUN_Venta(cent, true, ref Resultado);
错误!!!
我遇到的问题是,当通过函数时它告诉我:
附加信息:尝试在受保护的内存中读取或写入。这通常表明有其他内存损坏。
我究竟做错了什么?? 谢谢你的时间。
解决方案
CallingConvention = CallingConvention.Cdecl
是个问题。C 函数 typedef 是:
typedef void (WINAPI *TPROC_PAY_VENTA)(long Importe, bool ProcessMessages, TResultado *Resultado);
WINAPI
意味着stdcall
。DllImport
将行上的调用约定更改为CallingConvention.Stdcall
.
这里发生内存违规错误绝对是有道理的;如果 C# 代码认为调用约定是cdecl
它将向堆栈指针添加几个字节,这会使堆栈不平衡。
推荐阅读
- python - 多索引上的前向填充(ffill)
- c# - 如何在第二台计算机上修复不同的十进制设置 C#
- javascript - 尽管使用了 target="_blank",但 React Markdown 链接不会在新选项卡中打开
- linux - 像 PGAdmin 这样的 Oracle Web Tool 用于 Linux 安装?
- http - Golang 大响应 JSON 输入意外结束
- nagios - Nagios 核心摘要宏的计数错误
- eclipse - Jboss 6.1 Eclipse 4.19.0 集成
- python - 如果管理员在 tempbooking django 中将 is_active 更改为“true”,则尝试将所有信息从 Tempbooking 模型解析到 Booking 模型
- javascript - Vue3 - 在路由更改后构建 API url 并获取数据
- apache-spark - 将非常大的外部数据读入 Spark DataFrame