WF4アクティビティからアクセスする必要のあるCOMライブラリがいくつかあるのでtlbimp
、それらのマネージラッパーを生成していました。これは正常に機能しますが、いくつかのケースでは、引数の1つとしてVariantsの配列を期待するCOMメソッドがあり、配列の要素の1つは別のDLLからのCOMクラスのインスタンスです。同じオブジェクトを表すマネージラッパーへの参照がある場合でも、への参照を取得する方法を確認してください。
例として、とという2つのCOMライブラリがABC
ありDEF
、そのためにと呼ばれるマネージラッパーを作成し、を使用しているABCManaged
とします。次のシグニチャを持つメソッドがあるとします(VBスタイルのシグニチャを許可します。これは、ドキュメントに記載されている方法です)。DEFManaged
tlbimp
DEF
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
、基になるアンマネージ型に正しくマーシャリングされていません。オブジェクトを配列に貼り付けてマネージドに渡す前に、オブジェクトをアンマネージドタイプに手動でマーシャリングする方法がわかりません。DEF
object
CallFunction()
def
DEF
CallFunction()
ここでも、ストレートP/Invokeを使用することはできません。私は確かにコードを書くことができますが、要件の1つは、WF4アクティビティのユーザーがオブジェクトのプロパティとメソッドにアクセスできることDEFManaged
です。したがって、それらは管理対象オブジェクトである必要があります。