Итак, у меня есть функция, написанная на 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
, почему другой не может, требуя совсем другого класса?
(название отредактировано для ясности)