1

UnmanagedExportsを使用して、Delphi Win32 プログラムから .NET C# クラス ライブラリ関数を呼び出しています。チャームのように機能します!

私がまだ発見していないのは、C# と Delphi 側で配列型 (int[] や IMyUnknownBasedInterface[] など) を宣言して、2 つの言語間で配列を交換できるようにする方法です。可能でない場合は、何らかのコレクション オブジェクトまたはインデクサー メソッドを喜んで使用します。

何か案は?

4

2 に答える 2

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));
于 2012-11-30T09:38:00.867 に答える
0

これは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の両方で、それをうまく処理できるようになります。

于 2012-11-30T14:39:11.933 に答える