7

私は.NETDLLを持っています(それはたまたまC ++ / CLIで書かれています)。その一部をCOM経由で公開したい。これを行い、「regasm my.dll/codebase」を使用して登録します。ここまでは順調ですね。しかし、その後、いくつかの変更を行い、アセンブリのバージョン番号を変更し、さらにdllを別のフォルダーに移動します。再度登録して、OLE /COMViewerでCOMオブジェクトを確認します。私はこのようなものを見ます

InprocServer32[コードベース]=file://c://foo/bar/my.dll
7.0.0.0[クラス]=My.Blah.Class
7.0.0.0[アセンブリ]=同期、バージョン= 7.0.0.0、カルチャ=ニュートラル、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[クラス]=My.Blah.Class
7.0.0.27397[アセンブリ]=同期、バージョン= 7.0.0.27397、カルチャ=ニュートラル、PublicKeyToken = 1dd19234234
7.0.0.27397 [RuntimeVersion] = v2.0.50727
7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll

複数のバージョンに関する質問:

  1. したがって、最後に登録されたCOMオブジェクトが優先されると思います。古い7.0.0.0COMオブジェクトを登録しているかどうかは関係ありません。7.0.0.27397は、最後に登録したため、COMオブジェクトをインスタンス化したときに作成されるオブジェクトです。あれは正しいですか?

  2. おっと、私は7.0.0.0オブジェクトの周りを維持しませんでした。それを取り除く方法はありますか?レジストリにアクセスして手動で操作する以外に、COMオブジェクトのすべてのバージョンを削除する方法はありますか?

  3. 好奇心から、COMオブジェクトの特定のバージョンを具体的にインスタンス化したい場合、それを行う方法はありますか?(コード例を示したい場合は、C ++を使用しています)。

  4. バージョン番号を保存しないようにregasmに指示する方法はありますか。それは、物事が雑然としているように見え、利点が何であるかがわからないためです。COMオブジェクトでAPIが大幅に変更された場合は、GUIDとprogidを変更するだけですよね?複数のバージョンを登録したくない場合はどうなりますか(登録しません)。

4

2 に答える 2

6

この理由から、私は常にCOMに表示されるアセンブリを静的なAssemblyVersionで設定しています。バイナリにバージョンのタグを付けたい場合は、代わりにAssemblyFileVersionを使用してください。

  1. 最後に登録されたオブジェクトが勝ちます:うん
  2. あまり。アセンブリのComRegisterFunction/ComUnregisterFunction属性のメソッドにデータを入れてクリーンアップを自動化できますが、古いバージョンのドロップを残しておく場合は、これが唯一の方法です。
  3. 別のコクラスGUIDやProgID(MyCoClass.1、.2など)を使用して実行します。CoCreateInstanceはバージョン値について何も知りません-それらはCLRのアクティベーターによって使用され、正しいアセンブリをロードしたことを確認します。
  4. 最善の方法は、アセンブリのバージョンを変更しないことです(上記を参照)。
于 2009-11-11T23:02:42.303 に答える
0

特にアセンブリ間でビルド番号のみを変更した場合は、同じ CLSID を持つコンポーネントに互換性があるはずです。すぐにグーグルでこれを確認するために見つけた唯一の関連事項は次のとおりです。

質問に直接答えるには:

  1. 正しい。
  2. レガズム/登録解除
  3. Binding redirectsを調べてください。
  4. おそらくそうではありません。
于 2009-11-11T23:01:42.210 に答える