2010-04-28 6 views
6

Ich habe eine Anwendung in C# geschrieben, die auf sqlite Managed Provider abhängt. Der SQLite-Provider ist plattformabhängig (es gibt zwei DLLs für 32- und 64-Bit-Anwendungen mit demselben Namen). Die Anwendung lädt das gewünschte Programm zur Laufzeit basierend auf dem Betriebssystem.32 und 64-Bit-Assemblies in einem Windows-Installer

Das Problem ist, dass, während ein Installationsprogramm zu schaffen ich nicht 64-Bit-Modus dll zum Setup-Projekt hinzufügen kann, wie ich die folgende Störung erhalte: File '' targeting '' is not compatible with the project's target platform ''.

ich andere Installer verwenden würde, aber ich habe eine benutzerdefinierte Aktion, die sein muß wird während des Setups aufgerufen.

Also wollte ich wissen, ob es ein Installationsprogramm gibt, das ich 32 und 64-Bit-DLL hinzufügen und benutzerdefinierte Aktion in C# geschrieben ausführen kann.

Eine mögliche Lösung ist, zwei Installateure zu haben, aber ich möchte es, wenn möglich, vermeiden.

Irgendwelche Vorschläge?

Antwort

6

Die Inno Setup Installer unterstützen die Funktion, die Sie anfordern, dieser Installer ist sehr flexibel und zuverlässig, existieren viele Beispiele von Skripten im Internet, um eine bedingte Installation abhängig von der Architektur des endgültigen Clients zu machen.

prüfen dieses Skript befindet sich in 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; 
1

Mit Windows Installer, nein. Sie benötigen zwei Setups.

Allerdings NSIS ist in der Lage, beide Plattformen in einem einzigen Setup mit Runtime-Erkennung zu behandeln. Es hängt wirklich davon ab, ob Sie Enterprise-Nutzer anvisieren oder nicht, Enterprise-Kunden benötigen Windows Installer (MSI) -Pakete, während Ihr durchschnittlicher Internet-Benutzer kümmert sich nicht :)

1

Ich mag die Idee von Inno-Setup, würde ich wahrscheinlich geben Es ist ein Versuch, aber bedenken Sie folgendes:

Microsoft MSI Best Practice ist 2 separate Setup haben, eine für 32 und eine für 64, und viele Drittanbieter IDE wie Installshield unterstützen diese Best Practices. IMO gibt es wahrscheinlich Gründe dafür, sonst hätten sie diese Funktion hinzugefügt, um einen Vorteil gegenüber Konkurrenten zu haben.

Um 2 Setups aus einem einzigen Setup-Projekt zu erstellen, hätten Sie beide Installer aus demselben Setup-Projekt erstellt, mit Releaseflags, Sie erstellen grundsätzlich ein Feature, das Ihre 32-Bit-Assemblys enthält, ein anderes enthält die 64-Bit-Assembly ein Release-Flag zu jedem von ihnen, und bauen jedes Release separat,

So zur Build-Zeit, bauen Sie die 32-Bit-Version, es ist verpackt, während die 64bit ignoriert wird, dann tun Sie das gleiche für 64bit. Sie können diese Flags bei Bedarf über Befehlszeilenargumente übergeben.

Auf diese Weise haben Sie keinen doppelten Setup-Code zu pflegen.

1

Windows Installer funktioniert in diesem Szenario z. Habe zwei Komponenten mit jeweils einer der sqlite-Dateien und installiere bedingt die eine oder die andere basierend auf der VersionNT64-Eigenschaft, die nur festgelegt wird, wenn die Installation auf einer 64-Bit-Plattform ausgeführt wird.