繁体   English   中英

编组从C ++到C#的静态const char *

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM