0

次のことをしようとすると、私はかなり苦労しています。

私は現在、Visual Studio によって生成された相互運用 dll (より正確には tlbimp、暗黙的に) を介して ActiveX を使用しています。

この ActiveX にはさまざまなバージョンが存在し、インターフェイスのプロパティを追加、削除することがあります。バージョンを変更したい場合は、参照を変更し、再コンパイルする必要があります。

コードの単一バージョンが必要です。たとえば、Word を駆動するには、Word.Application の CreateInstance を介して単語オブジェクトをインスタンス化し、バージョンに関係なくメソッドを呼び出すことができることを覚えています。呼び出しは実行時にのみリンクされます。私が使用しているactiveXで同じことをしたいのですが、その方法が本当にわかりません(ところで、それはsage objets100c dllです)。ActiveX のリストに見つからないので、Word.Application のようにできるかどうかさえわかりません。

どうすればそれができるかについて誰かの手がかりがありますか?(私の必要性は、再コンパイルする必要のない1つのコードを持つことであるため、まったく異なるソリューションになる可能性があります)。

前もって感謝します

4

1 に答える 1

1

対応する *.tlb ファイルがある場合は、dll ではなく、このファイルを参照してください。リファレンスのプロパティ ウィンドウで、Specific Versionプロパティを toFalseおよびEmbedInterop Typestoに設定できますTrue(より安定します)。

これで問題が解決しない場合は、参照を追加する代わりに、オブジェクトを動的に作成してアクセスすることを試みることができます。COM タイプのいずれかが必要ProgIDです …</p>

Type comType = Type.GetTypeFromProgID("MyProg.ProgId");

… または COM タイプの CLSID (レジストリで見つけることができます)

Type comType = Type.GetTypeFromCLSID(new Guid("EA2BACD6-9D0F-4819-98BC-88E8173D3D16"));

次に、作成してオブジェクトを作成し、Activator.CreateInstanceそれをに割り当てて、dynamic遅延バインディングを行うことができます。

dynamic sage100 = Activator.CreateInstance(comType);

このdynamicオブジェクトの IntelliSense は取得されません。存在しないメンバー (メソッドまたはプロパティ名) を指定した場合でも、C# コードをコンパイルして実行できます。ただし、これらのメンバーにアクセスしようとすると、実行時例外がスローされます。

于 2021-03-01T14:25:51.510 に答える