gpt4 book ai didi

c# - 在 C# 中保留 C++ 指针是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:17 25 4
gpt4 key购买 nike

我目前正在编写一些使用调用的 C#/C++ 代码。在 C++ 端,有一个 std::vector 充满了指针,每个指针都由 C# 代码中的索引标识,例如函数声明如下所示:

void SetName(char* name, int idx)

但现在我在想,因为我正在使用指针,所以我不能将指针地址本身发送到 C#,然后在代码中我可以做这样的事情:

void SetName(char*name, int ptr)
{
((TypeName*)ptr)->name = name;
}

显然,这是我正在做的事情的快速版本(并且可能无法编译)。

是否可以保证指针地址在 C++ 中保持不变,以便我可以安全地将其地址存储在 C# 中,或者由于某种原因这会太不稳定或危险吗?

最佳答案

在 C# 中,你不需要在这里使用指针,你可以只使用普通的 C# 字符串。

[DllImport(...)]
extern void SetName(string name, int id);

之所以可行,是因为 p/invoke 中字符串的默认行为是使用 MarshalAs(UnmanagedType.LPStr),它会转换为 C 风格的 char*。如果每个参数需要一些其他的编码方式,您可以在 C# 声明中显式标记每个参数,例如,[MarshalAs(UnmanagedType.LPWStr)],对于每个字符串使用 2 个字节的 arg .

使用指针的唯一原因是,如果您需要在调用函数后保留对所指向数据的访问权。即使那样,您也可以在大多数时候使用 out 参数。

您基本上可以 p/invoke 任何东西而根本不需要指针(因此不需要不安全的代码,这在某些环境中需要特权执行)。

关于c# - 在 C# 中保留 C++ 指针是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7057022/

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