C # PInvoke Delphi DLL, которая возвращает строку, не удается только в IIS - PullRequest
0 голосов
/ 24 марта 2009

У меня есть Delphi 7 dll, которая экспортирует следующую функцию:

function StringTest(var StringOut : pchar) : boolean; stdcall;

begin
    GetMem(StringOut, 100);
    StrPCopy(StringOut, 'Test output string.');
    result := true;
end;

Эта функция импортируется в C # следующим образом:

[DllImport(@"C:\\Test\\DelphiTest.dll")]
public static extern bool StringTest(out string stringOut);

Когда я вызываю импорт из приложения WPF, он работает нормально, и я вижу мою тестовую строку, возвращенную в параметре out. Когда я пытаюсь сделать то же самое с сайта, размещенного в Кассини, он тоже отлично работает. Однако, когда я запускаю этот метод с сайта, размещенного в IIS7, происходит сбой. Если я закомментирую строки GetMem и StrPCopy, функция вернет «true» в IIS. Как я могу получить некоторые строковые данные обратно в C # из Delphi на сайте, размещенном в IIS?

1 Ответ

4 голосов
/ 24 марта 2009

Это не то, как «нормальные» функции dll возвращают строки. В вашем коде неясно, кто должен освобождать строку. Может быть, поэтому .Net не всегда это нравится. Вызывающая сторона должна выделить достаточно памяти для помещения строки результата.

function StringTest(const StringOut : pchar; MaxLen: Integer) : Boolean; stdcall;
begin
    StrPLCopy(StringOut, 'Test output string.', MaxLen);
    result := true;
end;

[DllImport(@"C:\\Test\\DelphiTest.dll", CharSet = CharSet.Ansi)]
public static extern bool StringTest(ref string stringOut, int maxLen);
...