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のバージョンを特定する/しないの設定であり、実行時には影響しませんでした。