6

sqlite マネージド プロバイダーに依存する C# で記述されたアプリケーションがあります。sqlite プロバイダーはプラットフォームに依存します (32 ビットと 64 ビットのアプリケーション用に同じ名前の 2 つの dll があります)。アプリケーションは、OS に基づいて実行時に必要なものをロードします。

問題は、インストーラーの作成中に 64 ビット モードの dll をセットアップ プロジェクトに追加できないことです。次のエラーが発生します:ファイル '' ターゲット '' は、プロジェクトのターゲット プラットフォーム '' と互換性がありません。

他のインストーラーを使用しますが、セットアップ中に呼び出す必要があるカスタム アクションがあります。

そこで、32 ビットと 64 ビットの dll を追加して C# で記述されたカスタム アクションを実行できるインストーラーがあるかどうかを知りたいと思いました。

考えられる解決策の 1 つは、インストーラーを 2 つ用意することですが、できれば避けたいと思います。

助言がありますか?

4

4 に答える 4

6

Inno Setup Installer は、要求された機能をサポートします。このインストーラーは非常に柔軟で信頼性が高く、最終的なクライアントのアーキテクチャに応じて条件付きインストールを行うためのスクリプトのサンプルが Web に多数存在します。

にあるこのスクリプトを確認してくださいC:\Program Files\Inno Setup 5\Examples\64BitThreeArch.iss

 -- 64BitThreeArch.iss --
; Demonstrates how to install a program built for three different
; architectures (x86, x64, Itanium) using a single installer.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=userdocs:Inno Setup Examples Output
; "ArchitecturesInstallIn64BitMode=x64 ia64" requests that the install
; be done in "64-bit mode" on x64 & Itanium, meaning it should use the
; native 64-bit Program Files directory and the 64-bit view of the
; registry. On all other architectures it will install in "32-bit mode".
ArchitecturesInstallIn64BitMode=x64 ia64

[Files]
; Install MyProg-x64.exe if running on x64, MyProg-IA64.exe if
; running on Itanium, MyProg.exe otherwise.
Source: "MyProg-x64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: IsX64
Source: "MyProg-IA64.exe"; DestDir: "{app}"; DestName: "MyProg.exe"; Check: IsIA64
Source: "MyProg.exe"; DestDir: "{app}"; Check: IsOtherArch
Source: "MyProg.chm"; DestDir: "{app}"
Source: "Readme.txt"; DestDir: "{app}"; Flags: isreadme

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"

[Code]
function IsX64: Boolean;
begin
  Result := Is64BitInstallMode and (ProcessorArchitecture = paX64);
end;

function IsIA64: Boolean;
begin
  Result := Is64BitInstallMode and (ProcessorArchitecture = paIA64);
end;

function IsOtherArch: Boolean;
begin
  Result := not IsX64 and not IsIA64;
end;
于 2010-04-28T20:47:21.623 に答える
1

Windows インストーラーでは、いいえ。2 つのセットアップが必要です。

ただし、 NSISはランタイム検出を使用して単一のセットアップで両方のプラットフォームを処理することができます。エンタープライズ ユーザーをターゲットにするかどうかは本当に異なります。エンタープライズ ユーザーは Windows インストーラー (MSI) パッケージを必要としますが、平均的なインターネット ユーザーは気にしません :)

于 2010-04-29T00:14:28.130 に答える
1

私は Inno セットアップのアイデアが気に入っています。おそらく試してみたいと思いますが、次の点を考慮してください。

Microsoft MSI のベスト プラクティスは、32 用と 64 用の 2 つの別々のセットアップを用意することです。Installshield などの多くのサード パーティ IDE は、これらのベスト プラクティスを推奨しています。IMOにはおそらく理由があります。そうでなければ、競合他社よりも優位に立つためにこの機能を追加したでしょう.

1 つのセットアップ プロジェクトから 2 つのセットアップをビルドするには、リリース フラグを使用して同じセットアップ プロジェクトから両方のインストーラーをビルドします。各リリースを個別にビルドし、

したがって、ビルド時に 32 ビット リリースをビルドし、パッケージ化します。64 ビットは無視されます。次に、64 ビットに対して同じことを行います。必要に応じて、これらのフラグをコマンド ライン引数で渡すことができます。

これにより、セットアップ コードを重複して維持する必要がなくなります。

于 2010-04-29T00:25:08.783 に答える