Итак, у меня есть функция, написанная на С++, которая выглядит так...
extern "C" __declspec(dllexport) int __stdcall SomeFunction(char *theData)
{
// stuff
}
... и я использую его в своем текущем проекте (написанном на С#). Существуют и другие проекты, которые используют эту функцию, написанную в VB, выглядящую так:
Public Declare Function SomeFunction Lib "MyDLL.dll" _
Alias "[email protected]" (ByVal theData As String) As Integer
Итак, я попробовал записать эквивалент в С#, но обнаружил, что использование типа строки на самом деле не работает для меня - строка вернется с теми же данными, с которыми я передал ее. Я попытался использовать "ref string"
вместо этого, чтобы передать строку по ссылке, и я получил нарушение доступа к памяти.
После некоторого копания я обнаружил, что это была правильная реализация в С#:
[DllImport("MyDLL.dll", EntryPoint = "[email protected]")]
public static extern int SomeFunction(StringBuilder theData);
Теперь я знаю, что VB.NET и С# совершенно разные, но я полагаю, что я всегда считал, что строки были строками. Если один из языков может нести марксировать char*
до String
, почему другой не может потребовать другого класса?
(отредактирован заголовок для ясности)