kurukuru-papaのブログ

主に、ソフトウェア開発に関連したメモを書き溜めたいと思います。

DLL配布しているSQLServer Compact 3.5にSPを当てる場合の注意

SQLServer Compact 3.5を使っています。アプリケーションにDLLを組み込むだけ、インストール不要でデータベースが使えるようになり、お手軽さを実感しています。

SQLServer Compactを長く使っていこうとした場合、一度配布したアプリケーションに対して、SQLServer Compactのサービスパックを当てる機会も出てくるかと思い、その方法を調査してみました。

簡単に考えれば、配布済みのアプリケーションに含まれるSQLServer CompactのDLLを、サービスパックのDLLで上書きすれば、動作しそうです。実際に動作確認してみると、SQLServer Compact 3.5 SP1からSP2の適用では、その通りでした。しかし、SPなしからSP1では、実行時にDLLが見つからない旨エラーが発生しました。この動作の違いは何から来るのでしょう?

調べてみると、SQLServer Compact 3.5のDLLに埋め込まれているアセンブリバージョンが影響するようです。各サービスパックのアセンブリバージョンは次のようになっていました。

サービスパック アセンブリバージョン 備考
SQLServer Compact 3.5 SPなし 3.5.0.0
SQLServer Compact 3.5 SP1 3.5.1.0 SPなしとは異なるアセンブリバージョン
SQLServer Compact 3.5 SP2 3.5.1.0 SP1と同一のアセンブリバージョン

呼び出し元のアプリケーションでは、ビルド時に、自分が参照するSQLServer Compactのアセンブリバージョンを実行ファイルに埋め込んでいるようです。そして、実行時には、ビルド時に参照していたアセンブリバージョンと一致するSQLServer CompactのDLLを探しに行くようです。

そのため、SQLServer Compact 3.5 SPなしでビルドしたアプリケーションに対して、SP1を上書きしても、アセンブリバージョンが異なってしまうため、動作しなかったようです。

結論として、SQLServer Compact 3.5のサービスパックの適用方法は次のようになると理解しました。

  • アセンブリバージョンが未変更のサービスパックの場合、サービスパックのDLLを上書きするだけで適用可能。
  • アセンブリバージョンに変更にあるサービスパックの場合、新しいサービスパックを適用した開発環境でビルドし直して、配布する必要がある。

蛇足ですが、調査中、1点勘違いした話を記述しておきます。

Visual Studioから外部DLLを参照する場合、参照設定に、「特定バージョン」というプロパティがあります。この設定をFalseにすると、参照するDLLのバージョンに依存しない参照設定ができそうな気がしましたが、勘違いでした。「特定バージョン」プロパティは、ビルド時に使用するDLLのバージョンを特定する/しないの設定であり、実行時には影響しませんでした。