Почему C # и VB.NET неявно маршалируют char * по-разному?

Итак, у меня есть функция, написанная на 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 # совершенно разные, но я полагаю Я всегда считал, что струны - это струны. Если один l anguage может неявно маршалировать char * в String , почему другой не может, требуя совсем другого класса?

(название отредактировано для ясности)

10
задан Superbeard 12 October 2011 в 18:54
поделиться