作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图在非托管 C++ DLL 上调用一个函数,搜索我接近的 stackoverflow 帖子,但我无法让它完全工作。
在.h文件中声明如下:
extern int SomeDLLMethod(const char **data, int *count);
数据是一个字符串
我在C#中声明如下:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int SomeDLLMethod(IntPtr data, ref int count);
然后我可以从 C# 中调用它,如下所示:
unsafe
{
fixed (byte* buffer = new byte[MAX_LENGTH])
{
IntPtr ptr = new IntPtr(buffer);
int count = 0;
var retVal = SomeDLLMethod(ptr, ref count);
var dataString = Marshal.PtrToStringAuto(ptr);
Console.WriteLine(dataString);
}
}
调用成功,缓冲区中有计数和数据,但如何将此值读回 C# 字符串?
Marshal 方法给我垃圾
最佳答案
问题中没有足够的信息可以 100% 确定,但我猜你需要这个:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
static extern int SomeDLLMethod(ref IntPtr data, ref int count);
.....
IntPtr data;
int count;
int retval = SomeDLLMethod(ref data, ref count);
string str = Marshal.PtrToStringAnsi(data, count);
理想情况下,当提出这样的问题时,您应该包括 native 函数的完整文档。我这样说是因为一个 char** 可以表示很多不同的意思。
我的假设是这里的 char** 是一个指向由 DLL 分配的以 null 结尾的 C 字符串的指针。您的代码假定调用者分配了缓冲区,但如果是这样,那么我希望看到的是 char* 而不是 char**。
关于c# - 如何从非托管 C++ dll char** 转换为 C# 字符串并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10100956/
我是一名优秀的程序员,十分优秀!