.NET/COM は、Regasm 経由で登録された複数のバージョンでどのように動作しますか?
質問
.NET DLL (C++/CLI で書かれたもの) があります。その一部をCOM経由で公開したいと思います。これを実行し、「regasm my.dll /codebase」を使用して登録します。ここまでは順調ですね。しかし、その後、いくつかのことを変更すると、アセンブリのバージョン番号が変わり、さらに dll を別のフォルダーに移動します。再度登録し、OLE/COM Viewer で COM オブジェクトを確認します。このようなものが見えます
InprocServer32 [Codebase] = file://c://foo/bar/my.dll 7.0.0.0 [Class] = My.Blah.Class 7.0.0.0 [Assembly] = Sync, Version=7.0.0.0, Culture=neutral, PublicKeyToken=1dd19234234 7.0.0.0 [RuntimeVersion] = v2.0.50727 7.0.0.0 [CodeBase] = file://c:/dooby/do/my.dll 7.0.0.27397 [Class] = My.Blah.Class 7.0.0.27397 [Assembly] = Sync, Version=7.0.0.27397, Culture=neutral, PublicKeyToken=1dd19234234 7.0.0.27397 [RuntimeVersion] = v2.0.50727 7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll
複数のバージョンに関する質問:
したがって、最後に登録された COM オブジェクトが優先されると思います。古い 7.0.0.0 COM オブジェクトが登録されているかどうかは関係ありません。7.0.0.27397 は最後に登録したため、COM オブジェクトをインスタンス化するときに作成されます。あれは正しいですか?
おっと、7.0.0.0 オブジェクトを保持していませんでした。それを取り除く方法はありますか?レジストリにアクセスして手動で破壊する以外に、COM オブジェクトのすべてのバージョンを削除する方法はありますか?
単なる好奇心から、COM オブジェクトの特定のバージョンを具体的にインスタンス化したい場合、それを行う方法はありますか?(コード例を示したい場合は、C++ を使用しています)。
バージョン番号を保存しないように regasm に指示する方法はありますか?COM オブジェクトに大幅な API 変更が加えられた場合、GUID と progid を変更するだけですよね。複数のバージョンを登録したくない場合はどうすればよいですか (登録しません)。
解決
私は、まさにこの理由から、COM に表示されるアセンブリを常に静的な AssemblyVersion で設定します。バイナリにバージョンのタグを付けたい場合は、代わりに AssemblyFileVersion を使用してください。
- 最後に登録されたオブジェクトが優先されます。そうだね
- あまり。アセンブリの ComRegisterFunction/ComUnregisterFunction 属性メソッドに何かを入れてクリーンアップを自動化することもできますが、古いバージョンのドロップを放置した場合、これがほぼ唯一の方法です。
- これは、別のコクラス GUID や ProgID (MyCoClass.1、.2 など) を使用して実行します。CoCreateInstance はバージョン値について何も知りません。バージョン値は CLR のアクティベーターによって適切なアセンブリが読み込まれたことを確認するために使用されます。
- いいえ、アセンブリのバージョンを変更しないことが最善です (上記を参照)。
他のヒント
同じ CLSID を持つコンポーネントは、特にアセンブリ間でビルド番号を変更しただけの場合は互換性があるはずです。ここだけです 関連する すぐにグーグルでこれを確認するために見つけたもの。
質問に直接答えるには:
- 正しい。
- 再ガスム/登録解除
- 調べてください バインディングリダイレクト.
- おそらくそうではありません。