ネイティブ(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# コードは出力文字列を受け取ります。
ただし、C# コードから呼び出されたときに Delphi コードをデバッグするときに、奇妙な点に気付きました。
そして、私はメモリをリークしているのではないかと心配しています - 誰かがそれらの PChars をクリーンアップしていますか?
これをどのように行うべきかについて、フィードバックやアドバイスをくれる人はいますか?