Вот родная (Delphi 7) функция:
function Foo(const PAnsiChar input) : PAnsiChar; stdcall; export;
var
s : string;
begin
s := SomeInternalMethod(input);
Result := PAnsiChar(s);
end;
Мне нужно вызвать это из C #, но имя dll не известно во время компиляции - поэтому я должен использовать LoadLibrary, чтобы добраться до него.
Вот так выглядит мой код на C #:
[DllImport("kernel32.dll")]
public extern static IntPtr LoadLibrary(String lpFileName);
[DllImport("kernel32.dll")]
public extern static IntPtr GetProcAddress(IntPtr handle, string funcName);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate string FooFunction(string input);
...
IntPtr dllHandle = LoadLibrary(dllName);
IntPtr fooProcAddr = GetProcAddress(dllHandle, "Foo");
FooFunction foo = (FooFunction)Marshal.GetDelegateForFunctionPointer(
fooProcAddr, typeof(FooFuncion)
);
string output = foo(myInputString);
Теперь это действительно работает - по крайней мере, код delphi правильно принимает строку, а код C # получает строку вывода.
Однако я заметил некоторую странность при отладке кода delphi, когда он вызывается из кода C # - отладчик пропускает строки, когда этого не должно быть.
И меня беспокоит, что у меня течет память - кто-нибудь чистит эти PChars?
Кто-нибудь может дать мне несколько отзывов / советов о том, как это должно быть сделано?