gpt4 book ai didi

c# - 将字符串从 C# 传递到 C++ .dll 会扰乱数据

转载 作者:行者123 更新时间:2023-11-30 01:44:51 38 4
gpt4 key购买 nike

我有一个 c++ dll,代码如下:

extern "C"
{
const char *SaveDate;

__declspec(dllexport) void SetDate(const char *date)
{
SaveDate = date;

std::cout << "date: " << SaveDate << std::endl;

}
}

当我在该函数中打印值时,它会打印

'date: 20160215' 

但是当我从另一个函数中获取“SaveDate”变量并打印它时,它会打印

'104'

我的 C# 是:

[DllImport("XmlRecord.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void SetSlate(string date);


public bool SetupRec()
{
string Date = DateTime.Now.ToString("yyyyMMdd");
SetSlate(Date);
}

为什么这个值在 c++ dll 中被加扰?

谢谢。

最佳答案

如果您使用 P/Invoke,传递给您的 C 函数的任何参数都将在调用期间有效

如果要重复使用输入的字符串,需要复制它。您作为参数获得的那个将在调用后被释放(您甚至不知道何时)。只需将其保存到 std::string 而不是保存 const char *

如果您绝对想避免复制数据,可以利用一些机制,但您必须在 C# 端采取适当的预防措施,因为 GC 可以随时移动内存中的对象。< br/>这涉及长期的对象固定(使用GCHandle 类),这对GC 是一种阻碍,所以最好避免。如果您可以将数据有效性限制为单个堆栈帧,则短期固定(使用 fixed 语句)是可行的。然后,您必须将数据作为 IntPtr 传递给 C 函数,以绕过 .NET 编码(marshal)处理。

关于c# - 将字符串从 C# 传递到 C++ .dll 会扰乱数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35419082/

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