none
マージモジュールのバージョンについて RRS feed

  • 質問

  • お世話になります。

    マージモジュールの考え方が良くわからない点がありますので御教授いただけますでしょうか。

    Visual Studio 2005で作成したアプリケーションとVisual Studio 2005 SP1で作成したアプリケーション

    があります。夫々のアプリケーションは、CRTを使用しています。

    現在、これらのアプリケーションを1つのインストーラでインストールしなければならない状況なのですが、

    この時、Visual Studio 2005環境のマージモジュールとVisual Studio 2005 SP1環境のマージモジュールの

    両方をインストールする必要がありますでしょうか。それとも、SP1環境のマージモジュールのみインストール

    すればよいのでしょうか。

    2007年1月16日 6:01

すべての返信

  • マージモジュールを両方同時に指定できるかはわかりませんが、それ以前の問題として、SPなしとSP1とで同一プロセスで動くアプリになっていますか?

    それともそうはなっておらず、一部のプロセスはSPなし、一部のプロセスはSP1という状況でしょうか?

    もし、前者のパターンであるなら、開発環境をどちらかに統一する必要があります。詳しくは、Side By Sideの仕組みとその歴史をたどっていただくことになるとは思いますが。。。w

    さて、本題のマージモジュールが指定できるか?ですが、インストーラ作成ツールは何をお使いでしょうか?

    両方のバージョンでマージモジュール名は同じですが、同名の別マージモジュールを複数指定することができるインストーラ作成ツールをお使いでしょうか?

    マージモジュールが複数同時指定できるかどうかは、マージモジュールそのものの作りとは別に、インストーラ作成ツールが任意のパスに存在するマージモジュールを自由に設定できるかどうか?という大きな問題があります。

    これが可能な作成ツールであれば、マージモジュール自身が複数指定できるように作られているかを調査ということになるのですが(私自身は確認していないため、同時指定ができるかどうかはわかりません)。

    2007年1月16日 7:43
  • 話は簡単です。
    インストールするモジュールのうちで、CRTとリンクするモジュールがいくつ
    か存在すると思いますが、それらがどのバージョンでビルドされているか?
    だけです。
      ・全てSP1でビルド     → SP1のマージモジュールのみ
      ・全て非SP1でビルド → 非SP1のマージモジュールのみ
      ・混在                          → 双方のマージモジュール

    以上です。

    2007年1月16日 7:49
  • ぶなっぷさん、ありがとうございます。

    こちらの環境は"混在"になりますので、双方のマージモジュールをインストールする方向で

    検討してみます。

     

    2007年1月16日 9:17
  • とっちゃんさん、ありがとうございます。

    こちらの環境は、「一部のプロセスはSPなし、一部のプロセスはSP1という状況」となりますので、両方のマージモジュールをインストールする

    ということですね。

    インストーラ作成ツールは、InstallShield12を使用しております。これから複数のマージモジュールをInstallShieldで設定できるかを

    調べたいと思います。

    助かりました。ありがとうございました。

     

     

     

    2007年1月16日 9:22
  •  YAG さんからの引用

    こちらの環境は、「一部のプロセスはSPなし、一部のプロセスはSP1という状況」となりますので、両方のマージモジュールをインストールする

    ということですね。

    インストーラ作成ツールは、InstallShield12を使用しております。これから複数のマージモジュールをInstallShieldで設定できるかを

    調べたいと思います。

    同一プロセスにて混在はないということですね。であれば、残る問題はマージモジュール自身がSPの有無で異なるものになっているかどうかとなります。

    ちょっと調べてみようかと思い、自分のマシンを見たところ、SPなしな環境がすでにないことに気付きました(SPなしの環境でのリリースがないため、SPの適用に制約がなく、全部適用済みでした)。そのため、残念ながら、私自身は調査することができません。

    幸いにも、ISをお持ちのようですので、それぞれのマージモジュールをISで直接開き、マージモジュールの ModuleSignature テーブルを参照し、値が異なるものとなっているかを確認してください。

    この際、マージモジュールをSPなしのVS2005がインストールされたところからと、SPありのVS2005がインストールされたところからの両方から取得する必要があります。

    また、IS自身もVS2005のマージモジュールを持っていると思いますので、これとのバージョンの違いも確認する必要があります。

    もし、このテーブルの値が同じ場合、マージモジュールとしては同一のバージョン違いと解釈されるため、どちらか一つしか選べません。

    たとえツール側では複数の同名モジュールを指定できるとしてもです。

    これは、msiの仕組み上の制約となるため、どうにもなりません。これに対する具体的な対応策は、msiを複数に分けるかどちらかのマージモジュールにあるファイルをインストールする事前インストーラを用意するかということになります。

    ISで事前インストーラを自由に作れるのかはわかりませんが。

    2007年1月16日 9:52
  • とっちゃんの話を聞いていて自信が無くなってきたんですが、
    ・同一プロセスにて混在 → プロセスが正常動作しない
                                                 (おそらくは起動すらしない)
    と思うので、インストール問題になっている以上、これは気にする必要がない
    と思っていました。

    また、以下の件は、ほぼ間違いなく異なっています。
    > 同一プロセスにて混在はないということですね。であれば、残る問題はマー
    > ジモジュール自身がSPの有無で異なるものになっているかどうかとなります。

    私がSP1のベータ版をインストール、私の隣に座っている方が非インストール
    環境のときに、私がビルドしたアプリのEXE, DLLだけを隣の方に渡したところ
    起動しませんでした。
    原因を調べたところ、マージモジュールのマニフェストファイルに書かれた
    CRTのフォルダが、隣の方のフォルダには存在しなかったからです。

    2007年1月17日 0:09
  •  ぶなっぷ さんからの引用
    とっちゃんの話を聞いていて自信が無くなってきたんですが、
    ・同一プロセスにて混在 → プロセスが正常動作しない
                                                 (おそらくは起動すらしない)
    と思うので、インストール問題になっている以上、これは気にする必要がない
    と思っていました。
    これは、必ずしも動かないとは言えません。MSVCR80.DLLの上位互換は9x系や2000などのために保持されているはずですので、先にSP1版がロードされていれば、動くと思います(逆はわかりませんが、動く場合がほとんどで、まれに動かないことがあるという感じではないかと)。

    やってみないとわからんというのが正直なところですが、そう簡単にテストできる項目でもないので(少なくとも、今現在の私の環境ではテストすることすらかなわない)、詳細は何とも言えないというところです。

     ぶなっぷ さんからの引用
    また、以下の件は、ほぼ間違いなく異なっています。
    > 同一プロセスにて混在はないということですね。であれば、残る問題はマー
    > ジモジュール自身がSPの有無で異なるものになっているかどうかとなります。

    私がSP1のベータ版をインストール、私の隣に座っている方が非インストール
    環境のときに、私がビルドしたアプリのEXE, DLLだけを隣の方に渡したところ
    起動しませんでした。
    原因を調べたところ、マージモジュールのマニフェストファイルに書かれた
    CRTのフォルダが、隣の方のフォルダには存在しなかったからです。

    マージモジュールの中身についてはまず間違いなく異なっています。これは絶対といえる保証は取れますけど、それとマージモジュールのモジュール識別子が異なっているかは別の問題です。

    問題になるのは、中身の違いではなく、それを使う側が同時に指定できるかどうかにあります。

    マージモジュールは、C++でいえば、名前空間を持つスタティックライブラリと同じです(中の個々のファイルがクラスと思っていただければと思います)。名前空間とクラス名が同じ場合、その中身が異なっていたとしても同時に使うことはできませんよね?

    名前空間か、クラス名を変えない限り同じものに見えてしまう以上、これはどうすることもできない問題といえます。

    マージモジュールでは、名前空間に当たるものが、モジュール識別子、クラス名に当たるものは、ファイル識別子(内部に識別子があります)となります。これらが全部同じであれば、そのクラスの中身(実際のファイル)が異なっているかどうかは関係なくて、どれか一つしか持てないということになります。

    残念ながら、これを同じとするか別とするかの判断は、マージモジュールを作る側の設計思想になりますので、使う側はあるものをどううまく使っていうか?を考えていくしかないということになります。

    2007年1月17日 2:49
  • とっちゃん様、ありがとうございます。

    なるほど、よく分かりました。私も脳天気すぎました。
    実際にインストールテストもせずに思いこみ野郎だったようです。

    お恥ずかしい限りです。

    2007年1月17日 3:59
  •  ぶなっぷ さんからの引用
    なるほど、よく分かりました。私も脳天気すぎました。
    実際にインストールテストもせずに思いこみ野郎だったようです。
    いえ。使う側の人が気にするようなところじゃないです。

    むしろこれを気にしなきゃいけないのは、マージモジュールを作る側のほうです。なので、知らなくて当然というより、知ってる必要がないといえます。

    私が詳しいのは、マージモジュールを作る側に所属しているためにすぎないだけのことです。

    なので、チェックしなければならない項目も把握している。だからこそこれを見てねともいえるんですよ。

    確かに、知っていて損はないのかもしれません。が、だからといって得をするというものでもありませんからねw

     

    2007年1月17日 8:59