【发布时间】:2023-03-22 05:35:01
【问题描述】:
所以我有一个用 C++ 编写的函数,看起来像这样......
extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
// stuff
}
...我正在我当前的项目中使用它(用 C# 编写)。还有其他项目使用这个函数用VB写的,看起来像这样:
Public Declare Function SomeFunction Lib "MyDLL.dll" _
Alias "_SomeFunction@4" (ByVal theData As String) As Integer
所以我尝试在 C# 中编写一个等价物,但发现使用字符串类型实际上对我不起作用 - 字符串会返回与我传递给它的数据相同的数据。我尝试使用 "ref string" 来通过引用传递字符串,但我遇到了内存访问冲突。
经过一番挖掘,我发现这是在 C# 中的正确实现:
[DllImport("MyDLL.dll", EntryPoint = "_SomeFunction@4")]
public static extern int SomeFunction(StringBuilder theData);
现在我知道 VB.NET 和 C# 完全不同,但我想我一直认为字符串是字符串。如果一种语言可以将char* 隐式编组为String,为什么另一种语言不能,完全需要不同的类?
(为了清楚起见,编辑了标题)
【问题讨论】:
-
用 JustDecompile 或 .NET Reflector 看看这两个版本可能会很有趣。
标签: c# c++ vb.net string marshalling