none
VB.NETにおけるバージョン間の互換性のバイナリ互換設定 RRS feed

  • 質問

  •  

    お世話になります。

     

    VB6の場合、バージョン間の互換性をプロジェクトのプロパティページで

    設定する際に「バイナリ互換」なるものが指定できますが、

    VB.NETでは該当する設定がありません。

     

    VB.NETでこれと同様のことを実現(参照先が更新されたときに

    インターフェース変更を伴わない場合は、参照元プロジェクトの

    再ビルドは不要なように)したい場合、どのようにすればよいのでしょうか?

     

    もしかして、バージョン番号を同じにしておけば、レジストリ登録しているDLL

    に修正後のDLLを被せても大丈夫ということでしょうか?

     

    情報をお持ちの方、ご教授くださいますよう、宜しくお願い致します。

    2008年2月6日 1:48

回答

  • VB6の知識がないので間違っているかもしれません。

    特別なことをしなければ単にDLLの置き換えだけで大丈夫です。ただ、厳密名を付与してバージョンを変えてしまった場合はロードできません。しかし、設定ファイルなどを変更してバージョンアップ後のDLLを参照することができます。

    ・厳密名
    ・コードベース
    ・サイドバイサイド

    などで調べてみてください。

    2008年2月6日 11:54
  • 外池です。.NetのCOM相互運用機能に絡んだバージョン管理、ということで、了解です。

     

    で、結論として、ご要望のことは実現できますが、

     

    VB.NETでCOMのDLLをバイナリ互換で再ビルドする際の操作は、慎重を要するので、書籍やドキュメントを参考にされることをお勧めします。たぶん、詳細な説明は、書籍じゃないとダメかもしれないです。

     

    私の手元には、DAN APPLEMAN著「標準 VB.NETプログラミング」がありますが・・・、お手元に何とか用意できませんでしょうか? COM相互運用機能で、バイナリ互換を維持する方法の例が、ズバリ解説されています。

     

    ----追記

     

    上述の書籍は、.Net Framework 1.0時代のものなので、2.0以降とIDEでの操作に違いがあるようですが、本質的には同じ方法が使えそうです。

     

    ----さらに追記(さらに修正。「修飾子」は誤り。正しくは「属性」)

     

    ごちゃごちゃ、っと自分でやってみて、整理した要点です。

    • COM相互運用で公開したいクラスライブラリーをVB.NETで書く場合で、特に、バイナリ互換性を維持しつつ、生成されるDLLファイルを差し替える作業のみでライブラリーの更新を行いたいときには、
    • VB.NETでクラスを定義する際に、<ComClass()>属性を使って、クラス、インターフェイス、イベントのUUIDを明示的に指定してやる。(用途によってはイベントのUUIDはオプションナル。指定しなくてもよい) この指定してやったUUIDは以後、変更しない。さらに、そのクラスで公開するメンバーについても<DispID>修飾子を使って明示的にIDを指定する。
    • AssemblyVersionも明示的に指定したら、変えないようにする。(この点については、もう一度議論する。)

    こうしておけば、VB.NETで実装を変更してビルドしなおしても、出来上がったDLLファイルのみを再配布して差し替えてもらうだけで、大丈夫のはずです。

     

    しかし、上述3点のうち最後の1点について、これは.Netのお作法からすると嫌な感じがします。AssemblyVersionはDLLをビルドしなおす度に更新してやり、配布先ではregasmを使って再登録はしてもらうようにした方がよいかと思います。この再登録も、よくよく考えてみると、COM相互運用の仕組みのうち、.Net側の情報を更新するだけであって、COM側のアプリから見える部分はなんら変更を加えるものではない(クラスやインターフェイスのUUID、メンバーのIDは変更していない)ので、大丈夫かと。

     

    2008年2月7日 1:00

すべての返信

  • 外池と申します。

     

    VB6時代のご経験は、ActiveXかActiveEXEの、いわゆるCOMのことを仰っていると思います。

     

    で「VB.NETでこれと同様のことを実現」とお尋ねになっていますが、A) VB.NETで作成する.Net Frameworkのクラスライブラリーのバージョン管理のことを仰っていますか? それとも、B) VB.NETで作成するCOMのライブラリーのバージョン管理のことを仰っていますか?

     

    A)か、B)かによって、全然回答が違ってきます・・・。レジストリ登録という文言が出てくるので、B)かな? と思いますが。

     

     

     

    2008年2月6日 3:47
  • 外池です。すいません、ちょっとテストです。(一度投稿したのに表示されないので・・・)

     

    2008年2月6日 4:07
  • VB6の知識がないので間違っているかもしれません。

    特別なことをしなければ単にDLLの置き換えだけで大丈夫です。ただ、厳密名を付与してバージョンを変えてしまった場合はロードできません。しかし、設定ファイルなどを変更してバージョンアップ後のDLLを参照することができます。

    ・厳密名
    ・コードベース
    ・サイドバイサイド

    などで調べてみてください。

    2008年2月6日 11:54
  • 外池様

     

    ありがとうございます。お世話になります。

     

    知りたいのは、「COM相互運用機能の登録」を行うクラスライブラリについてですので、

    B)ということになると思います。

     

    A)については、囚人様の御回答にあるとおり、ですよね?

    2008年2月7日 0:27
  • 囚人様

     

    ありがとうございます。お世話になります。

     

    2点ほど確認させてください。

     

    ・ということは、厳密名を付与しない限りはバージョン管理自体が行われず、

     バージョンを上げてもDLLの置き換えだけで対応できるのでしょうか?

     

     →試した感じ、なんとなく出来てるっぽいのですが、確証が持てないです。

     

    ・厳密名によるバージョン管理を行う場合の「設定ファイル」というのは、

     同名でバージョン違いのDLLを参照し、ビルドした際に勝手に生成される

      app.configというファイルのことでしょうか?

     

     →GrapeCity社製のコンポーネントを使用しているプロジェクトでたまに

       生成されて困っているのですが、もしかしてこれが原因だったのでしょうか?

     

     

    お手数をおかけしますが、宜しくお願い致します。

    2008年2月7日 0:53
  • 外池です。.NetのCOM相互運用機能に絡んだバージョン管理、ということで、了解です。

     

    で、結論として、ご要望のことは実現できますが、

     

    VB.NETでCOMのDLLをバイナリ互換で再ビルドする際の操作は、慎重を要するので、書籍やドキュメントを参考にされることをお勧めします。たぶん、詳細な説明は、書籍じゃないとダメかもしれないです。

     

    私の手元には、DAN APPLEMAN著「標準 VB.NETプログラミング」がありますが・・・、お手元に何とか用意できませんでしょうか? COM相互運用機能で、バイナリ互換を維持する方法の例が、ズバリ解説されています。

     

    ----追記

     

    上述の書籍は、.Net Framework 1.0時代のものなので、2.0以降とIDEでの操作に違いがあるようですが、本質的には同じ方法が使えそうです。

     

    ----さらに追記(さらに修正。「修飾子」は誤り。正しくは「属性」)

     

    ごちゃごちゃ、っと自分でやってみて、整理した要点です。

    • COM相互運用で公開したいクラスライブラリーをVB.NETで書く場合で、特に、バイナリ互換性を維持しつつ、生成されるDLLファイルを差し替える作業のみでライブラリーの更新を行いたいときには、
    • VB.NETでクラスを定義する際に、<ComClass()>属性を使って、クラス、インターフェイス、イベントのUUIDを明示的に指定してやる。(用途によってはイベントのUUIDはオプションナル。指定しなくてもよい) この指定してやったUUIDは以後、変更しない。さらに、そのクラスで公開するメンバーについても<DispID>修飾子を使って明示的にIDを指定する。
    • AssemblyVersionも明示的に指定したら、変えないようにする。(この点については、もう一度議論する。)

    こうしておけば、VB.NETで実装を変更してビルドしなおしても、出来上がったDLLファイルのみを再配布して差し替えてもらうだけで、大丈夫のはずです。

     

    しかし、上述3点のうち最後の1点について、これは.Netのお作法からすると嫌な感じがします。AssemblyVersionはDLLをビルドしなおす度に更新してやり、配布先ではregasmを使って再登録はしてもらうようにした方がよいかと思います。この再登録も、よくよく考えてみると、COM相互運用の仕組みのうち、.Net側の情報を更新するだけであって、COM側のアプリから見える部分はなんら変更を加えるものではない(クラスやインターフェイスのUUID、メンバーのIDは変更していない)ので、大丈夫かと。

     

    2008年2月7日 1:00
  • 外池様

     

    レスが遅くなって大変申し訳ありません。

     

    とてもわかりやすい回答を頂き、ありがとうございます。

     

    基本、<ComClass()>修飾子にてGUIDを指定した後、それを変えさえしなければ、

    ビルド後の配布手順を(RegAsmによるレジストリ登録も含めて)VB6と同じ流れに

    できそうですね。

     

    教えていただいた書籍については手配しましたので、

    入手次第、内容を確認し、検証しようと思います。

     

    2008年2月8日 8:40
  • こんにちは。中川俊輔 です。

     

    外池さん、囚人さん、大変参考になる回答ありがとうございます。

     

    Anonymousさん、フォーラムのご利用ありがとうございます。

    問題が解決されたようなので、外池さん、囚人さんの回答へ回答済みチェックをつけさせていただきました。

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    問題解決につながる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    Anonymousさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年2月14日 8:48