0

この数日間、COM オブジェクトの C# リフレクションについて見つけたものをすべて読み、コードで多くの実験を試み、サンプル コードを分析して理解を深めましたが、今では、自分の知識が十分でないことを認めざるを得ません。そのため、コミュニティに助けを求めています。

オブジェクトとしてラップされたレイト バインド COM オブジェクトのプロパティにアクセスして更新できる必要がありますSystem._COM

私はすべての標準的なリフェクションを試してみましたが成功しIDispatchませんでした. 私が必要とすることを行う方法を示している MSDN の論文を見つけましたが、すべての例は C++ で書かれており、私の頭を悩ませています。

次の単純な C# コードが期待どおりに機能しない理由を誰かが説明できれば、非常に役に立ちます。

            try
        {
            // late binding:
            // localCB is a COM object (System._COMObject) created by Activator.CreateInstance() from 
            // the ProgID of a registered COM .DLL. 
            // 
            // The original .DLL has a string PROPERTY called 
            // "TESTEXTERNAL1". localCB has an IDispatch Interface.  The original COM .DLL has a separate Typelib,
            // and, although I did not register the typelib separately, I can see from OLEView on the COM object
            // that  the GUID for the typelib is included in it.

            // Here's the code that is puzzling me...
             var vv = localCB.GetType().InvokeMember("TESTEXTERNAL1", BindingFlags.GetProperty, 
                  null, localCB, null);
            string rt = vv.ToString();
            // works exactly as expected and returns the value of TESTEXTERNAL1 -  OK.

            // now try and update the SAME PROPERTY, on the SAME COM object...
            Parameters = new Object[1];
            Parameters[0] = "Hello, World!";
            localCB.GetType().InvokeMember("TESTEXTERNAL1", BindingFlags.SetProperty, 
                  null, localCB, Parameters);
            // throws an (inner) exception: HRESULT 0x8002003 DISP_E_MEMBERNOTFOUND !!!

        }
        catch (Exception xa)
        {
            string xam = xa.Message;
        }

すでにプロパティを見つけて提供しているオブジェクトが、同じプロパティを更新できると期待するのは不合理ですか? 私が気付いていない「代替更新」戦略はありますか?

助けてくれてありがとう、

ピート。

アップデート:

Jon のリクエストに応えて、OleView のスニペットを以下に示します: (Oleview では切り取りと貼り付けができないため、画像を使用する必要がありました。申し訳ありません...)

COM .DLL の OleView

OLEView typelib ビュー

Jon さん、セッター メソッドに問題があることを正しく認識したと思います。DLL は富士通 COBOL で記述されており、PROPERTY として識別されるフィールドに対して「隠れた」GET および SET を提供します。C# または COBOL から COM コンポーネントにアクセスすると正常に動作しますが、ご覧のとおり、リフレクションを使用して SET にアクセスしようとすると動作しません。私はリフレクションの使用に慣れていないため、構文が正しいかどうか疑問でした。そのため、SET を GET にできるだけ近づけようとしました。独自の SET メソッドを (PROPERTY ごとに) COBOL に生成し、「BindingFlags.SetProperty」を「BindingFlags.InvokeMember」に変更する必要があると思います。(BindingFlags の宿題をしたところ、「SetProperty」を指定すると、言及した他の 2 つのフラグが自動的に暗示されることがわかりました。)

すべての鍵は、問題が富士通 *COM Class SET にあることを認識することにあると思います。経験豊富な目でそれを確認する必要がありました。どうもありがとう。OLEView を確認した後に何かコメントがある場合、またはプロパティ セットを取得するための別の方法を提案できる場合は、非常に興味があります。(私は、すべてのプロパティに対して SETter メソッドを生成する必要があることを楽しみにしていません。それは力ずくの攻撃です... :-))

再度、感謝します、

ピート。

4

1 に答える 1