![](/img/trans.png)
[英]Marshalling my C++ .dll in C# with “const char*” and “const int”
[英]Marshalling static const char* from C++ to C#
我有一段代码,我想知道它是否正确:
HELLO.CPP
static const char _someGlovalVar[] = "my persistant gloval variable";
const char* DLLInterfaceGetName()
{
return _someGlovalVar;
}
hello.h
DLL_EXPORT const char* DLLInterfaceGetName();
hello.cs中
[DllImport("hello.dll", EntryPoint = "DLLInterfaceGetName", CharSet = CharSet.Ansi)]
public static extern string DLLInterfaceGetName();
这个对吗?
将返回值更改为IntPtr而不是字符串。
[DllImport("hello.dll", EntryPoint = "DLLInterfaceGetName", CharSet = CharSet.Ansi)]
public static extern IntPtr DLLInterfaceGetName();
然后,当您在C#代码中调用它时,将指针编组为C#字符串:
IntPtr cstr = DLLInterfaceGetName();
String str = Marshal.PtrToStringAnsi(cstr);
另外,请仔细检查您是否在DLLImport上使用正确的调用约定。 我有一个问题,因为它默认使用StdCall,我实际上想要Cdecl。
它有用吗? 在这种情况下,我认为你不必关心其他任何事情:)
虽然就个人而言,我有点担心这是如何处理的。 一个静态的const char []指针可能在代码部分,不是吗? 希望.NET marshaller将字符串中的数据复制到自己的字符串中。 我不确定CPP方面如何处理这个问题 - 不同的编译器是否可能产生截然不同的输出?
而且,你不应该在字符串的末尾放一个\\0
吗? 调用者如何知道字符串与char[]
有多长? 我认为,如果它不适合你,这就是原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.