gpt4 book ai didi

c# - 在 c# 中使用 cpp 代码(返回自定义结构和标准 :string)

转载 作者:太空宇宙 更新时间:2023-11-04 11:26:28 25 4
gpt4 key购买 nike

我正在尝试构建一个包装器以在 c# 代码中使用 cpp 代码,我想返回自定义结构(类)作为方法 2 的输出,以及方法 1 的 std::string,这是我在 cpp 中的代码

extern "C" __declspec(dllexport)  std::string method1()
{
std::string s;
//Some Code/////////
return s;
}

这是应该返回自定义结构(或类)的方法

extern "C" __declspec(dllexport)  MyStruct method2()
{
MyStruct s;
//Some Code//////
return s;
}

我尝试为这两种方法编写 C# 代码,这是我的 C# 代码

[DllImport("<dllPath>", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string method1(); //Exception

[DllImport("<DllPath>")]
public static extern MyStruct method2(); //Compile Error

现在,当我尝试运行 C# 代码时,方法 1 出现 MarshalDirectiveException,方法 2 出现编译错误?

最佳答案

在第一个 PInvoke 中,C++ 方法应该返回 const char* (s.c_str())。您应该删除“[return [...]]”并用 IntPtr 替换字符串。然后,您可以使用 Marshal.PtrToStringAnsi(ptr) 将 IntPtr 转换为字符串。 http://msdn.microsoft.com/en-US/library/s9ts558h(v=vs.110).aspx可以帮助你。

在第二个 PInvoke 中,您应该在 C# 中定义 MyStruct(但我不能更精确,因为我没有关于 MyStruct 的信息)。此链接可以帮助您:http://www.codeproject.com/Articles/66243/Marshaling-with-C-Chapter-Marshaling-Compound-Ty

编辑:感谢 hvd 的评论,有时使用 BSTR 会更好,因为使用 char* 可能很危险!

关于c# - 在 c# 中使用 cpp 代码(返回自定义结构和标准 :string),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26523416/

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