WF4アクティビティからアクセスする必要のあるCOMライブラリがいくつかあるのでtlbimp、それらのマネージラッパーを生成していました。これは正常に機能しますが、いくつかのケースでは、引数の1つとしてVariantsの配列を期待するCOMメソッドがあり、配列の要素の1つは別のDLLからのCOMクラスのインスタンスです。同じオブジェクトを表すマネージラッパーへの参照がある場合でも、への参照を取得する方法を確認してください。
例として、とという2つのCOMライブラリがABCありDEF、そのためにと呼ばれるマネージラッパーを作成し、を使用しているABCManagedとします。次のシグニチャを持つメソッドがあるとします(VBスタイルのシグニチャを許可します。これは、ドキュメントに記載されている方法です)。DEFManagedtlbimpDEF
CallFunction (parmArray() as Variant) as Long
これは次のように表さDEFManagedれます。
int CallFunction(ref object parmArray)
ここまでは順調ですね。さて、引数であるVariantsの配列の要素はCallFunction()異なるタイプであるため、私の場合、最初の要素はadoubleで、2番目の要素はのインスタンスですABC。これが、管理対象に渡すためにアレイを構築する方法ですCallFunction()。
// obtain our managed ABC from the workflow context
ABCManaged abc = context.GetValue(this.InputABC);
object[] parameters = new object[2];
parameters[0] = new double();
parameters[1] = abc;
DEFManaged def = new DEFManaged();
def.CallFunction(parameters);
これは正常にコンパイルされますが、機能しません-を呼び出すと、次のCallFunction()例外がスローされます。
System.ArgumentException: Value does not fall within the expected range.
私の推測では、おそらく署名にの配列があり、配列の要素の実際の型を決定するロジックがCOMメソッドの実装のどこかにあるためdef、基になるアンマネージ型に正しくマーシャリングされていません。オブジェクトを配列に貼り付けてマネージドに渡す前に、オブジェクトをアンマネージドタイプに手動でマーシャリングする方法がわかりません。DEFobjectCallFunction()defDEFCallFunction()
ここでも、ストレートP/Invokeを使用することはできません。私は確かにコードを書くことができますが、要件の1つは、WF4アクティビティのユーザーがオブジェクトのプロパティとメソッドにアクセスできることDEFManagedです。したがって、それらは管理対象オブジェクトである必要があります。