2

.Net 4.0 用のテスト COM プロジェクトを作成しました。次に、それを regasm に登録します。

RegAsm /codebase  TestCom.dll /TLB

そしてそれは JavaScript で正しく動作します:

var app = new ActiveXObject("TestCom.TestClass");
app.Message1("123");

.Net 3.5 用の別の C# プロジェクトから TestCom.TestClass を使用したいのですが、このプロジェクトへの参照を追加しようとすると、より高いフレームワーク バージョンに関するエラーが発生します。[参照の追加] ダイアログ (セクション COM) には、dll ではなく、tlb ファイルへの参照のみが表示されます。

これはあるべき姿ですか?tlb ファイルへの参照を追加しようとすると、次のエラーが発生します。

「代わりに .NET アセンブリへの参照を追加してください」

.Net 3.5 の別の C# プロジェクトから TestCom.TestClass のインスタンスを作成するにはどうすればよいですか?

4

1 に答える 1

7

IDE は、選択したタイプ ライブラリから、COM サーバーが .NET で実装されていることを認識できます。そして、それを追加することを拒否するだけです.これを行うことは意味がありません. 代わりに .NET アセンブリへの参照を追加すると、同様に、実際にはより適切に機能します。

マシンをだますことができないわけではありません。動的なキーワードで遅延バインディングを使用できます。IDEがそれを妨害する方法はありません。しかし、実際には、管理されていないクライアントがサーバーを使用する方法で COM サーバーをテストしているわけではありません。CLR は実行時に、COM サーバーが実際には .NET サーバーであることを検出し、配管をショートカットします。つまり、サーバーの RCW は作成されません。また、サーバーは CCW を作成しません。これは、アセンブリ参照を追加した場合とまったく同じように機能するようになりました。

したがって、このようにすることは本当に意味がありません。アセンブリ参照を追加するだけで、IntelliSense サポートと静的型チェックから得られる多くの利点を享受できます。そして、.NET ライブラリをテストするのと同じ方法で、COM サーバー コードをテストします。テストしない、基本的にテストできないのは、COM 相互運用レイヤーです。どちらでも構いません。実際に問題になることはありません。そして、それがなんらかの不思議な理由によるものである場合、それについて何かをすることはできません.CLR内のCOM相互運用はとにかくブラックボックスです.

サーバー コードのテストに加えて行う必要があるのは、統合テストを実行することだけです。実際の管理されていないクライアントが実際にサーバーを使用できることを確認してください。あなたは、Javascript からうまく機能することをすでに知っています。

于 2013-11-13T10:59:31.717 に答える