使用 c# 中的 c++ 引用中的引用从 C# 错误调用 C++ 代码
Posted
技术标签:
【中文标题】使用 c# 中的 c++ 引用中的引用从 C# 错误调用 C++ 代码【英文标题】:Calling C++ code from C# error using references in c++ ref in c# 【发布时间】:2012-05-21 08:35:14 【问题描述】:所以在我的 c++.dll 文件中,我得到了以下函数:
DLL void GetUserPass(char* &userName, char* &passWord)
userName = "ceva";
passWord = "altceva";
现在我想从 c# 调用它,但它给了我一个错误:
[DllImport("myDLL.dll")]
private static extern void GetUserPass(ref string userName, ref string passWord);
static void f()
string userName ="";
string passWord ="";
GetUserPass(ref userName, ref passWord);
错误是:
对 PInvoke 函数“下载 FTP 存档!Download_FTP_Archive.Program::GetUserPass”的调用导致堆栈不平衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
我应该在 C++ dll 文件中尝试类似:
using std::string;
DLL void GetUserPass(string &userName, string &passWord)
userName = "ceva";
passWord = "altceva";
【问题讨论】:
Strings in c++? 的可能重复项 搜索,例如,“c++ c# string interop”很容易得到数千次点击,解释如何处理这个 也许链接到这数千个点击中的一个会比详细说明其存在的评论更有用¯_(ツ)_/¯ 【参考方案1】:尝试以下方法:
DLL void __stdcall GetUserPass(char* &userName, char* &passWord)
userName = "ceva";
passWord = "altceva";
[DllImport("myDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
private static extern void GetUserPass(ref IntPtr userName, ref IntPtr passWord);
static void f()
IntPtr userNamePtr = new IntPtr();
IntPtr passWordPtr = new IntPtr();
GetUserPass(ref userNamePtr, ref passWordPtr);
string userName = Marshal.PtrToStringAnsi( userNamePtr );
string passWord = Marshal.PtrToStringAnsi( passWordPtr );
【讨论】:
【参考方案2】:我不是 C++ 开发人员,但我对 C++ 语义有点熟悉。这个char* &userName
对我来说毫无意义。也许我错了,但试试char* userName
看看它是否适合你。
【讨论】:
不,它不起作用 :( char* 对我来说表示指向终止的零字符(字符串)的指针,而 & 表示保留该值。我不知道我是否记得好。 他的 C++ 函数很好,您提出的更改会破坏它的语义。但是char*&
可能不是编组的最佳类型
好的,我现在知道它可以工作了。将引用类型与指针混合对我来说有点令人困惑。 c++ 使用 ansi 字符串和 c# unicode 存在问题。也许你应该在你的代码中指定这个?在这里阅读:***.com/questions/683013/…以上是关于使用 c# 中的 c++ 引用中的引用从 C# 错误调用 C++ 代码的主要内容,如果未能解决你的问题,请参考以下文章