0

C#WinFormsプロジェクトを使用して、遅延バインディングを使用して、Amibrokerと呼ばれるプログラムによって提供されるCOM自動化APIに接続しようとしています。これまでのところ、1つのアイテムを除いて、APIのすべてに接続できました。これは、広範なグーグルに基づく「パラメーター化されたプロパティ」であると信じています。

ドキュメントによると、API仕様は次のようになります(フルバージョンはこちら: http: //www.amibroker.com/guide/objects.html):

Property Filter(ByVal nType  As Integer, ByVal pszCategory As String) As Long [r/w]

値を更新するJavaScriptスニペットは次のようになります。

AB = new ActiveXObject("Broker.Application");
AA = AB.Analysis;
AA.Filter( 0, "market" ) = 0;

次のC#実行時バインディングコードを使用して、プロパティの値を取得できますが、値を設定する方法を一生理解することはできません。

object[] parameter = new object[2];
parameter[0] = Number;
parameter[1] = Type;
object filters = _analysis.GetType().InvokeMember("Filter", BindingFlags.GetProperty, null, _analysis, parameter);

これまでに試しました:

  • BindingFlags.SetProperty、BindingFlags.SetFieldを使用する
  • 返されたオブジェクトをPropertyInfoオブジェクトにキャストし、それを使用して値を更新しようとします
  • 値を含むオブジェクトをパラメータオブジェクトに追加する
  • 最後の努力として他の様々なもの

私が見ることができることから、これは簡単なはずですが、C#での遅延バインディングはせいぜい面倒だと感じています。プロパティは私へのメソッド呼び出しのように見えますが、それが私を失望させています。メソッドに値を割り当てるにはどうすればよいですか?また、遅延バインディングC#コードのプロトタイプはどのようになりますか?

うまくいけば、それで十分に説明できますが、不明な点がないかどうかお気軽にお問い合わせください。助けてくれてありがとう!

ダニエル

4

2 に答える 2

1

はい、COMのプロパティは内部のメソッドとして実装されています。メソッド名は「set_Filter」である必要があります。問題が発生している本当の理由は、VB6宣言を使用しているためだと思います。VB6 Longタイプは、実際にはC#では長くはなく、intです。長い値でプロパティを割り当てようとすると失敗します。

このコードをVB.NETで記述すると、はるかに簡単になり、Javaと同様の「自然な」構文を使用して、レイトバウンドメソッドとプロパティアクセスを完全にサポートします。また、C#とは異なり、インデックス付きのプロパティをサポートします。C#プロジェクトで参照できる小さなラッパーアセンブリを作成します。VS2010以降、新しい動的キーワードを使用してC#でも使用できます。

于 2010-05-10T21:41:23.187 に答える
0

これがC#に変換されたVBコードです。ハンスへのコメントには合いませんでした。

object x = RuntimeHelpers.GetObjectValue(Interaction.CreateObject("Broker.Application", ""));
NewLateBinding.LateSetComplex(NewLateBinding.LateGet(x, null, "Analysis", new object[0], null, null, null), null, "Filter", new object[] { 0, "market", 0x22 }, null, null, false, true);

皆様のご協力に感謝します!

于 2010-05-11T14:09:01.170 に答える