从C#错误使用在c#在C ++ REF参考主叫C ++代码(Calling C++ code fro

2019-09-17 09:20发布

所以在我的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";
}

Answer 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 );
}


Answer 2:

我不是一个C ++开发者,但我是一个有点熟悉C ++的语义。 这个char* &userName是没有意义的我。 也许我错了,但尽量char* userName和看它是否适合你。



文章来源: Calling C++ code from C# error using references in c++ ref in c#
标签: c# c++ dll pinvoke