UnmanagedExportsを使用して、Delphi Win32 プログラムから .NET C# クラス ライブラリ関数を呼び出しています。チャームのように機能します!
私がまだ発見していないのは、C# と Delphi 側で配列型 (int[] や IMyUnknownBasedInterface[] など) を宣言して、2 つの言語間で配列を交換できるようにする方法です。可能でない場合は、何らかのコレクション オブジェクトまたはインデクサー メソッドを喜んで使用します。
何か案は?
UnmanagedExportsを使用して、Delphi Win32 プログラムから .NET C# クラス ライブラリ関数を呼び出しています。チャームのように機能します!
私がまだ発見していないのは、C# と Delphi 側で配列型 (int[] や IMyUnknownBasedInterface[] など) を宣言して、2 つの言語間で配列を交換できるようにする方法です。可能でない場合は、何らかのコレクション オブジェクトまたはインデクサー メソッドを喜んで使用します。
何か案は?
C# 側では、次のようにします。
[DllExport("Foo", CallingConvention = CallingConvention.Stdcall)]
static extern void Foo(int[] a, int len);
Delphi 側では次のようになります。
procedure Foo(a: PInteger; len: Integer); stdcall; external 'manageddll.dll';
Delphi から関数を呼び出すには、次のようにします。
var
a: array of Integer;
....
SetLength(a, 666);
//populate a
Foo(PInteger(a), Length(a));
これはC#側では簡単ですが、Delphi側ではロイヤルPITAになる可能性があります。
ここでの問題は、ネイティブからマーシャリングされたインターフェイスのArrayプロパティがある場合、CLRは配列サイズについて非常に慎重になるということです。
ベストショットは、C#で簡単に宣言できる安全な配列です...
public interface ISample
{
int[] YourArray
{
[return:MarshalAs(UnmanagedType.SafeArray)]
get;
}
ただし、Delphi側では、安全な配列を扱うのは非常に面倒です。
私自身の場合、ネイティブとC#の間で共有されるインターフェイスで配列を公開しませんでした。IEnumerableを模倣したインターフェイスを使用しましたが、DelphiまたはC#で簡単に実装できます。
メソッドMoveNext、GetCurrent、およびプロパティCurrentを提供する別のインターフェイスを返すようにすると、C#とDelphiの両方で、それをうまく処理できるようになります。