从C#传递的字符串与C ++字符串不同,都是const char

时间:2018-04-30 16:01:32

标签: c# c++

我有一个c#程序,用于检查c ++ dll中的数据库字符串。

我已经读过这个页面了:

我的字符串传递良好而没有错误,但我的问题是它们在C ++ dll中不匹配。

我尝试使用Messagebox,Console和Everything检查它们,它们在字符,大小,文本方面是相同的......

如果其他总是返回false ...

我的C ++代码(test_match.dll):

extern "C" __declspec(dllexport) int check_string(const char* string_from_csharp);
int check_string(const char* string_from_csharp)
{
    if (string_from_csharp == "hello world!" ){
    return 1;
    }else{
    return 0;
    }
}

我的C#代码:

[DllImport("test_match.dll",
CallingConvention = CallingConvention.Cdecl , 
CharSet = CharSet.Unicode)]
private static extern int check_string(string string_from_csharp)

我的C#使用代码(WPF):

int get_match_state = check_string(inputtext.Text);

C ++中的MessageBox,说...输入是"你好世界!"

但它总是返回0

另外,我尝试将它们转换为wchar_t,std :: string with find()但没有改变。

我在哪里犯错? 感谢

3 个答案:

答案 0 :(得分:2)

你不能比较那样的字符串:

if (string_from_csharp == "hello world!" )

如果您绝对需要使用char *,请使用strcmpstrncmp

extern "C" __declspec(dllexport) int check_string(const char* string_from_csharp);
bool check_string(const char* string_from_csharp)
{
  return (strcmp(string_from_csharp, "hello world!") == 0);
}

您可能希望使用std::string,因为您使用的是C ++。在这种情况下,您可以使用std::string::compare

答案 1 :(得分:0)

正如tkausl和Daisy在评论中提到的我相信C ++,你正在比较指针值而不是实际的字符串值。在您的情况下,我认为进行比较的最简单方法是使用strcmp来比较2个字符串。

答案 2 :(得分:0)

正确答案属于MartinVéronneau和Hans Passant(@ hans-passant @ martin-véronneau)

  

CharSet.Unicode错误,你需要CharSet.Ansi来匹配一个char *   论点。并且您需要在C语言中正确地比较字符串   你使用strcmp()。至少CharSet不匹配应该很容易   要使用调试器进行发现,请确保您知道如何调试本机代码   当从C#转发时。 - 汉斯帕斯特

谢谢汉斯和马丁! 问题是CharSet = CharSet.Unicode,我改为CharSet = CharSet.Ansi,现在一切正常!