C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Installerクラス使用Setup Projの.Net

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■90679 / inTopicNo.1)  Installerクラス使用Setup Projの.Net
  
□投稿者/ WADA (1回)-(2019/04/05(Fri) 12:40:46)

分類:[.NET 全般] 

2019/04/05(Fri) 17:41:56 編集(投稿者)

こんにちは。
昔、VB2008で作成したVBアプリをセットアッププロジェクトを使用して配布しています。
また、このセットアッププロジェクトでは、Installerクラスを用いたdllを作成し、
カスタム動作を使用しています。
現在はアプリ・セットアッププロジェクト共にVS2013に移行しましたが、
.Net Frameworkは共に3.5SP1のままで使用していました。

ここで、ふと、Frameworkを3.5から4系に変更しようと思い、
試しにアプリとカスタム動作で使用しているFrameworkを4.5にしてみました。
すると、旧バージョンのアプリがインストール済みの場合、
Framework4.5で作成したカスタム動作を含むインストーラでインストールを行うと、途中で
「このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。」
というエラーが出て、インストールが中止されてしまいます。
なお、セットアッププロジェクトのプロパティで、
DetectNewerInstalledVersionとRemovePreviousVersionsは共にTrueです。

カスタム動作のFrameworkのバージョンを変えてしまうと
旧バージョンインストール済みの場合の最新版置き換えが
できなくなってしまうのでしょうか?
それとも他に何か方法はあるでしょうか?
それとも、カスタム動作のFrameworkは3.5SP1のままでもOKでしょうか?
引用返信 編集キー/
■90687 / inTopicNo.2)  Re[1]: Installerクラス使用Setup Projの.Net
□投稿者/ とっちゃん (583回)-(2019/04/07(Sun) 11:28:21)
No90679 (WADA さん) に返信
No90679 (WADA さん) に返信

> Framework4.5で作成したカスタム動作を含むインストーラでインストールを行うと、途中で
> 「このアセンブリは現在読み込まれているランタイムより新しいランタイムでビルドされているため、読み込むことができません。」
> というエラーが出て、インストールが中止されてしまいます。
> なお、セットアッププロジェクトのプロパティで、
> DetectNewerInstalledVersionとRemovePreviousVersionsは共にTrueです。
>
新規にインストールした場合はこのエラーは出ないのですよね?

> カスタム動作のFrameworkのバージョンを変えてしまうと
> 旧バージョンインストール済みの場合の最新版置き換えが
> できなくなってしまうのでしょうか?
> それとも他に何か方法はあるでしょうか?
> それとも、カスタム動作のFrameworkは3.5SP1のままでもOKでしょうか?

バージョンアップする場合だけ出るとしたら、残念ですが Setupプロジェクトの動作仕様なんだと思います。
おそらくですが、直接的な原因はカスタム動作を呼び出すための Setup プロジェクトの特殊なモジュールが
アンロードされないためにバージョン不整合が起こるんだと思います。

ただ、それが原因だとして、じゃぁどうやれば回避できるのか?というと、おそらくどうしようもない。。。
ということになるんじゃないかと。

可能性レベルですが、回避できるとしたら

1. DLLでつくる
2. 3.5.1 と互換性がある構成だけで作成する。

の2つを頑張るくらいしかないかなぁ?と思います。

あとは、運用回避で、先にアンインストールしてもらってからインストールを行う。
というくらいじゃないかな?と思います。

引用返信 編集キー/
■90689 / inTopicNo.3)  Re[2]: Installerクラス使用Setup Projの.Net
□投稿者/ WADA (2回)-(2019/04/08(Mon) 10:24:20)
とっちゃん 様、ご回答ありがとうございました。
最悪、

> あとは、運用回避で、先にアンインストールしてもらってからインストールを行う。

で対応しようと思います。

ところで、

> 可能性レベルですが、回避できるとしたら
>
> 1. DLLでつくる

の「DLL」とは、カスタム動作の部分をアンマネージドのDLLでつくる、ということでしょうか?
十分理解できておらず、申し訳ございません。
引用返信 編集キー/
■90695 / inTopicNo.4)  Re[3]: Installerクラス使用Setup Projの.Net
□投稿者/ とっちゃん (584回)-(2019/04/08(Mon) 18:08:21)
No90689 (WADA さん) に返信
>>可能性レベルですが、回避できるとしたら
>>
>>1. DLLでつくる
>
> の「DLL」とは、カスタム動作の部分をアンマネージドのDLLでつくる、ということでしょうか?
> 十分理解できておらず、申し訳ございません。

すいません。ちょっと(どころかかなり)言葉足らずですね。

通常、Installerクラスは既存のDLLやEXEに埋め込んで作ることが多いと思うのですが
そういう形ではなく、独立した専用のDLLとして用意するということです。

試してみないとわからない部分はあるのですが、エラー自体は、すでに 3.5.1 のランタイムが稼働しているところに
4.x 系を参照するアセンブリをロードできないからエラーとなっているので
4.x でビルドはされていても内容的には 3.5.1 のものしか使っていないという構造にしてやれば、エラーを回避できる可能性があります。

カスタム動作の動作ロジックそのものが非公開なので、このあたりは試してみないとわかりません。

カスタム動作の仕組みそのものがかなり特殊(というより、特異な実装というレベル)なので、正直わからん。。。
というところも多々あります。

もちろん、カスタム動作ではなく、msi のCustomActions なDLLを作ってそれで置き換えるという方法もありますが
Setupプロジェクトが、任意のCustomActionsを呼び出せるようには「なっていない」のでその方法はあまりお勧めできなかったりします。
もし、そこまで頑張れるのなら、WiX や InstallShield といったもっと強力かつ自由度の高いインストーラ作成ツールに
移行することをお勧めします。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ