为什么C#和VB.NET以不同的方式隐式编组char*?

Sup*_*ard 10 c# c++ vb.net string marshalling

所以我有一个用C++编写的函数,看起来像这样......

extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
    // stuff
}
Run Code Online (Sandbox Code Playgroud)

...我在我当前的项目中使用它(用C#编写).还有其他项目使用VB编写的这个函数,如下所示:

Public Declare Function SomeFunction Lib "MyDLL.dll" _
    Alias "_SomeFunction@4" (ByVal theData As String) As Integer
Run Code Online (Sandbox Code Playgroud)

所以我尝试在C#中编写一个等价物,但发现使用字符串类型对我来说实际上并不起作用 - 字符串会返回我传递给它的相同数据.我尝试使用"ref string"而不是通过引用传递字符串,我得到了内存访问冲突.

在做了一些挖掘之后,我发现这是C#中正确的实现:

[DllImport("MyDLL.dll", EntryPoint = "_SomeFunction@4")]
public static extern int SomeFunction(StringBuilder theData);
Run Code Online (Sandbox Code Playgroud)

现在我知道VB.NET和C#是完全不同的,但我想我总是认为字符串是字符串.如果一种语言能够元帅char*String隐,为什么不能等,需要一个不同的类共?

(为清晰起见编辑了标题)

Dav*_*nan 6

现在我知道VB.NET和C#是完全不同的,但我想我总是认为字符串是字符串

字符串在.net中是不可变的.问问自己为什么ByVal传递不可变数据类型会导致值发生变化.对于正常功能,这不会发生Declare.

我猜这一切都与保持与Declare经典VB6中的语句的向后兼容性有关.在我看来,这里的黑羊是VB.net代码而不是C#代码.