3

Microsoftのプライマリ相互運用機能アセンブリの1つで宣言されたメソッドが間違っています。

それは次のように宣言されています:

void Write(object[] psarray);

これは正しくないため、実際には次のように宣言する必要があります。

void Write([In, MarshalAs(UnmanagedType.SafeArray)] object[] psarray);

[In, MarshalAs(UnmanagedType.SafeArray)]元のメソッドを呼び出すときに、コンパイラにを使用させる必要があります。

私は次のようなことをすることに反対していませ

object[] parameters = new Object[1];
parameters[0] = theStringIWantedToPass;

thing.GetType().InvokeMethod(
      "write", 
      BindingFlags.InvokeMethod,
      null,
      thing, 
      parameters);

ただし、 UnmanagedType.SafeArrayマーシャリングを使用するには、 InvokeMethodをオーバーライドする方法を知っている必要があります。

注:リフレクションを使用してメソッドを呼び出すことが必要なことを達成できるかどうかわからないため、「いいね」と言います。重要なのは、.NETがそのようなことを許可している限り、メソッドを長い道のりで呼び出したり、レジスタをロードしてアセンブリJMP命令を発行したりすることに反対していないということです。


注:別のクラスであるため、別の署名でクラスを再宣言することはできません。

4

1 に答える 1

2

この欠点を克服する 1 つの方法は、PIA を分解し、問題を修正してから再構築することです。

過去に相互運用アセンブリでこれを行う必要があったのは、私または私の友人のどちらも初めてではありません。

于 2009-01-28T22:24:47.720 に答える