gpt4 book ai didi

c# - char * 在托管代码中?

转载 作者:太空宇宙 更新时间:2023-11-03 19:33:51 29 4
gpt4 key购买 nike

我有一个生成值的 c++ plus 方法。我正在从 C# 应用程序调用此方法。
C++的方法是这样的:

extern "C" REGISTRATION_API char * generate(char dIn[],char dOut[])

generate 方法返回一个字符数组 (sOut[]=returnvalue; return sOut;)

现在我从我的 C# 应用程序调用此方法:

[DllImport("mydll.dll")]
static extern string generate(string sIn, string sOut);

如您所见,c# 中的返回类型是string。发生的事情是 c# 中的返回值不正确并且已损坏。 (generate 方法中的值是正确的,但是每当我从 c# 调用它来提取它时,我都会得到一些错误的值。)

我的方法在 C# 中有一个 string 返回值,而在 c++ 中它是一个 char* 可以吗?请分享您的意见,很紧急,谢谢。

最佳答案

不幸的是,char* 可能有些歧义。 (从字面上看,它是一个指向单个字符的指针,您可能会或可能无法通过像数组一样取消引用该指针来获取其他字符。)但通常,它是一个指向以 null 结尾的单字节字符串的指针ANSI 编码(Microsoft 称之为 LPStr )。默认情况下,P/Invoke 将 System.String 的实例编码为 BStr类型,类似于 Unicode Pascal 字符串(开头有长度)。您需要使用 MarshalAs attribute明确指定您希望如何在托管代码和非托管代码之间编码字符串。

很可能,你会想这样声明它:

[DllImport("mydll.dll")]
[return: MarshalAs(UnmanagedType.LPStr)]
static extern string generate(
[MarshalAs(UnmanagedType.LPStr)] string sIn,
[MarshalAs(UnmanagedType.LPStr)] out string sOut);

但是,您的函数签名令人困惑:它是返回 字符串,还是设置输出变量?您可能需要调整 P/Invoke 声明以满足您的需要。

关于c# - char * 在托管代码中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3187759/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com