Вот собственная функция (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?
Может ли кто-нибудь дать мне отзыв / совет о том, как это должно быть сделано?
MAX_PATH
) или б) используете двухэтапный алгоритм, при этом первый шаг возвращает только необходимый размер буфера, а второй - буфер не менее этого размера. Роб довольно хорошо это объясняет. 11.11.2009