在 C# 中调用 C/C++ 方法

Posted

技术标签:

【中文标题】在 C# 中调用 C/C++ 方法【英文标题】:Calling C/C++ method in C# 【发布时间】:2013-08-07 09:15:54 【问题描述】:

假设您有一个库 my_library.dll,其中声明了以下方法:

int method_1(char *param1, unsigned long *param2, bool param3)
int method_2(char *param1, unsigned long *param2, bool param3, bool &param4, long &param5, char[1024] param6)

您需要在 C# 中调用它们。要调用 method_1,我可以这样做:

[DllImport("my_library.dll", EntryPoint = "method_1")]
static extern int mapped_method_1(string param1, UInt32 param2, byte param3)

ma​​pped_method_1 可以作为常规 C# 方法调用。

有人可以帮我为 method_2 执行此操作吗? 我正在努力如何映射“&”参数和(可能)数组。我不断收到 AccessViolationException - 试图读取或写入受保护的内存

我的目标是调用 extraPutty API 方法。我可以呼叫 Connexion,但无法呼叫 Connexion_F

http://www.extraputty.com/htmldoc/Chapter7.html

【问题讨论】:

你不能使用refout吗? (取决于method_2 是否期望&param4&param5 中的值)。 为什么在mapped_method_1 中使用byte 代替param3 而不是Booleanbool 我在教程中发现了这一点。我自己不是 C/C++/C# 开发人员(我做 java)。它起作用了,所以我离开了它。我猜是因为 C 将数字表示为布尔值没有问题。 指针参数需要使用ref关键字。 【参考方案1】:

这就是你要找的东西

[DllImport("my_library.dll", EntryPoint = "method_2")]
static extern int mapped_method_2([MarshalAs(UnmanagedType.LPWStr)]string param1, 
UInt32 param2, bool param3, 
ref bool param4,  ref long param5,
ref char[] param6);

【讨论】:

好吧,如果没有 AccessViolationException,我仍然无法从 extraputty api 调用 connexion 方法,但谷歌搜索表明,您的解决方案可能是正确的。 要解决您的 AccessViolationException,您必须放置完整的堆栈。这可能是因为您试图通过 ref 将变量传递给正在使用或受保护的函数。或者可能是 C 和 C# 之间的类型内存表示【参考方案2】:

试试下面的语法:

[DllImport("my_library.dll", EntryPoint = "method_2")]
static extern int mapped_method_2(string param1, UInt32 param2, byte param3, byte* param4, UInt32 param2, string param6)

【讨论】:

以上是关于在 C# 中调用 C/C++ 方法的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 调用 C/C++ 代码

C#中的委托是啥?事件是否一种委托?

C#调用C++编的dll文件里的方法报错

C#调用C++编的dll文件里的方法报错

C#上位机开发(十四)—— C#中通过dll库调用外部C/C++函数

C#上位机开发(十四)—— C#中通过dll库调用外部C/C++函数