1

我有两个通信组件 - 一个托管,另一个非托管。托管需要从非托管实现中检索字符串(相同的字符串或只是一个副本)。我尝试了以下代码。

// Unmanaged code
const char* GetTestName(Test* test)
{
    return test->getName();
}

// Managed wrapper
[DllImport(DllName, EntryPoint = "GetTestName")]
public static extern IntPtr GetTestName(IntPtr testObj);

// API Invocation
IntPtr testName = GetTestName(test);
string testStr = Marshal.PtrToStringAuto(testName);

但是, testStr 的值不是预期的。有谁知道我在这里做错了什么?任何建议都会非常有帮助。

4

2 回答 2

1

我建议这样做:

[DllImport(DllName, EntryPoint = "EntryPoint")]
[MarshalAs(UnmanagedType.LPStr)]
public static extern StringBuilder GetTestName(IntPtr testObj);

UnmanagedType.LPStr 适用于字符串和 System.Text.StringBuilder,也许还有其他(我只使用过这两个)。不过,我发现 StringBuilder 的工作更加一致。

有关各种字符串编组选项的详细信息,请参阅此 MSDN 文章

于 2010-10-08T18:36:28.407 回答
1

你很接近,但你必须使用 PtrToStringAnsi()。自动使用系统默认值,即 Unicode。

于 2010-10-08T18:22:37.343 回答