2010-04-28 7 views
6

나는 C#으로 작성된 애플리케이션을 sqlite managed provider에 의존하고있다. sqlite 공급자는 플랫폼에 따라 다릅니다 (이름이 같은 32 비트 및 64 비트 응용 프로그램 용 DLL이 두 개 있습니다). 응용 프로그램은 OS에 따라 런타임에 원하는 것을로드합니다.하나의 Windows 인스톨러에 32 비트 및 64 비트 어셈블리

문제는 설치 프로그램을 만드는 동안 나는 다음과 같은 오류가 점점 오전으로 내가 설치 프로젝트에 64 비트 모드 DLL을 추가 할 수 있다는 것입니다 : File '' targeting '' is not compatible with the project's target platform ''.

내가 다른 설치 프로그램을 사용을하지만 난해야합니다 사용자 지정 작업이 설정 중에 호출됩니다.

그래서 32 비트와 64 비트 DLL을 추가하고 C#으로 작성된 사용자 지정 작업을 실행하는 설치 프로그램이 있는지 알고 싶었습니다.

한 가지 가능한 솔루션은 두 명의 설치 관리자를 갖는 것이지만 가능한 경우이를 피하고 싶습니다.

제안 사항?

답변

6

설치 관리자는 요청하신 기능을 지원합니다.이 설치 프로그램은 매우 유연하고 신뢰할 수 있으며 최종 클라이언트의 아키텍처에 따라 조건부 설치를 수행하기 위해 많은 스크립트 샘플이 웹에 존재합니다.

확인이 스크립트는 Windows 설치로 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

에있는, 아니. 두 가지 설정이 필요합니다.

그러나 NSIS은 런타임 검색과 함께 단일 설정에서 두 플랫폼을 모두 처리 할 수 ​​있습니다. 엔터프라이즈 사용자를 대상으로하는지 여부는 기업 고객이 MSI (Windows Installer) 패키지를 요구하는 경우에 따라 달라집니다.

1

저는 Inno 설정에 대한 아이디어가 마음에들 것입니다. 시도해보십시오. 그러나 다음을 고려하십시오.

Microsoft MSI 모범 사례는 2 개의 별도 설정, 32 및 64 용 Installshield와 같은 많은 타사 IDE가 이러한 모범 사례를 보증한다는 것입니다. IMO는 아마도 이것에 대한 이유가있을 것이며, 그렇지 않으면 경쟁자보다 우위를 차지할 수있는이 기능을 추가했을 것입니다.

단일 설치 프로젝트에서 2 개의 설치 프로그램을 빌드하려면 릴리스 플래그를 사용하여 두 설치 프로그램을 빌드하고 기본적으로 32 비트 어셈블리가 들어있는 하나의 기능을 만들고 다른 하나는 64 비트 프로그램을 포함하고 assign 각 릴리스를 개별적으로 빌드하고 각 릴리스를 따로 빌드하십시오.

빌드시 빌드시 32 비트 릴리스를 빌드하고 64 비트는 무시한 다음 64 비트에 대해 동일한 작업을 수행합니다. 필요한 경우 명령 행 인수를 통해 해당 플래그를 전달할 수 있습니다.

이렇게하면 유지 관리 할 중복 설정 코드가 없습니다.

1

Windows Installer는이 시나리오에서 잘 작동합니다. 각각 sqlite 파일 중 하나와 함께 두 개의 구성 요소를 가지며 64 비트 플랫폼에서 설치가 실행될 때만 설정되는 VersionNT64 속성을 기반으로 조건부로 다른 하나를 설치하십시오.

관련 문제