在 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 ¶m4, long ¶m5, 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)
mapped_method_1 可以作为常规 C# 方法调用。
有人可以帮我为 method_2 执行此操作吗? 我正在努力如何映射“&”参数和(可能)数组。我不断收到 AccessViolationException - 试图读取或写入受保护的内存
我的目标是调用 extraPutty API 方法。我可以呼叫 Connexion,但无法呼叫 Connexion_F。
http://www.extraputty.com/htmldoc/Chapter7.html
【问题讨论】:
你不能使用ref
或out
吗? (取决于method_2
是否期望&param4
和&param5
中的值)。
为什么在mapped_method_1
中使用byte
代替param3
而不是Boolean
或bool
?
我在教程中发现了这一点。我自己不是 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++ 方法的主要内容,如果未能解决你的问题,请参考以下文章