문제

너무 많은 실험 끝에 Windows Installer는 단순히 나쁜 기술이라는 결론에 도달했습니다.하지만 고객은 MSI 파일을 원합니다.

그렇다면 EXE 파일을 임시 디렉터리에 추출하고 EXE 파일에 전달된 것과 동일하거나 유사한 옵션으로 실행하는 MSI 파일을 어떻게 만들 수 있습니까?

MSI 옵션은 다음에 설명되어 있습니다. Msiexec(명령줄 옵션) (MSI의 낮은 수준 "실행"은 msiexec 옵션 package.msi입니다).

편집하다:mjmarsh의 WiX 솔루션이 작동하는 것 같습니다.아직 시도해 볼 기회가 없었을 뿐입니다(크런치 타임).효과가 있다면 받아들이겠습니다.

편집하다:작동하지 않습니다.누락된 작품:유/무인은 이용할 수 없는 것 같습니다.

어쨌든, 이 작업을 수행하는 유일한 방법은 사용자 지정 작업이 상위 프로세스를 종료하는 것입니다!

편집하다:그래서 누군가가 모든 것을 설치 후 사용자 정의 작업으로 래핑하는 추가 답변으로 게시했습니다.이론적으로는 가능하지만 재부팅이 필요할 수 있으므로(때때로 재부팅이 필요한 .NET 4용 MS 덕분에) 추가 해커 작업을 수행해야 합니다.따라서 장점 매트릭스에서 :

Transparency: No. One big custom action.
Customizability: No.
Standardization: No. 
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.

요점이 없습니다.

도움이 되었습니까?

해결책 4

해결책이 없습니다. MSI 중첩 문제로 인해 회사 MSI 설치가 어쨌든 깨질 때 NSIS를 갔다. 노력하다 언젠가 MSI 내부에서 EXE 랩핑 MSI 설치).

다른 팁

글쎄, 자유로운 방법과 $$$ 방법이 있습니다. 여기서 모든 것을 문서화 할 수는 없지만 이렇게하면 시작해야합니다.

참고로, Windows Installer는 미친 기술입니다. 작업이 간단하다고 생각하는 곳이 여러 번 있지만 실제로는 복잡해집니다. 당신은 그것을 이해하기 위해 자신을 몰입해야합니다.

어쨌든 여기에 간다 :

무료 : wix (여기)

XML 구성 파일 세트에서 MSI 파일을 생성하는 무료 도구입니다. 온라인으로 튜토리얼을 찾을 수는 있지만 여기에 다음과 같습니다.

WXS 파일에서 다음 태그를 사용하여 EXE를 설치 프로그램으로 압축 할 수 있습니다.

<Binary Id="MYEXE" src="<path to my exe?"/>

그런 다음 EXE 파일을 시작하는 사용자 정의 작업을 만들 수 있습니다.

<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
      ExeCommand="my command line"/>

그런 다음 사용자 정의 작업을 InstallExecuteSequence 적절한 장소에서 InstallInitialize 그리고 InstallFinalize)

<InstallExecuteSequence>
   <Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>

$$$ : InstallShield를 얻으십시오 (여기)

먼저 "기본 MSI"프로젝트를 만들고 원하는 말을하십시오. setup.exe가 생성되지 않았습니다. 릴리스 설정에서 이것을 설정합니다.

그런 다음 본질적으로 Wix와 같은 일을하지만 UI가 있습니다.

  • 직접 편집기를 사용하고 'Binary'테이블에 EXE 파일을 넣어 Helper EXE 파일을 지정할 수 있습니다.
  • 왼쪽 트리의 "사용자 정의 작업"노드에서 해당 EXE 파일을 시작할 사용자 정의 작업을 만들 수 있습니다.
  • "설치 시퀀스"를 선택하고이를 InstallExecuteSequence 그 사이의 어딘가 InstallInitialize 그리고 InstallFinalize 예전에 내가 말했듯이.

죄송합니다. 더 자세히 할 수는 없지만 이것은 좋은 출발이되어야합니다.

.msi 파일을 만드는 가장 쉬운 방법은 사용하는 것입니다. wix.

레슨 1 WIX 튜토리얼에서 간단한 설치를 만들기 만하면됩니다.

여호수아, 나는 당신의 좌절감을 잘 이해합니다. MSI는 배포를 생각하는 완전히 새로운 방법입니다. 그럼에도 불구하고 Applied MSI는 특히 기업 고객에게 최상의 배포를 제공합니다.

설치 관리자 EXE는 어떤 작업을 수행합니까? 대부분 파일 사본, 일부 등록 및 일부 레지스트리가 쓰여 지거나 복잡한 설치 로직을 실행하고 데이터베이스를 설정하는 것 등? 내가 묻는 이유는 아마도 당신을 위해 잘 작동하는 WIX MSI를 만들어서 EXE 접근법을 포기할 수 있기 때문에 아마도 잘 작동하는 WIX MSI를 만들 수 있기 때문입니다.

실제로 MSI 내부에서 EXE를 실행할 수는 있지만 적절한 시퀀싱이 필요하며 간단한 MSI보다 더 많은 블루스를 유발할 수 있습니다. 앱이 작고 설치 중에 미친 짓을하지 않으면 기본적인 WIX 변환을 제공하게되어 기쁩니다.

또 한있다 MSI 래퍼의 무료 버전. 또한 제거 및 업그레이드를 지원합니다. 또한 추가 또는 제거 프로그램에서만 하나의 항목 만 생성합니다.

추가 weir's 대답, 변경 custom action attribute 아래처럼 :

<!--Run Action-->
    <CustomAction Id="RunWrappedExe"
                  Return="asyncNoWait"
                  FileKey="ApplicationFileId"
                  Execute="deferred"
                  ExeCommand=""
                  HideTarget="no"
                  Impersonate="yes"/>

환경 Return=asyncNoWai 기다리지 않습니다 exe 돌려 주다. 설치 프로그램은 작업을 수행하고 정상적으로 닫힙니다. 한편, exe 계속 실행.

-Madhuresh

MSI를 관리하고 싶지 않고 EXE 만 실행하려면 시도하십시오. MSI 변환기가 무료로 exe. 당신은 방금 exe로가는 길을 넣고 MSI를 얻습니다.

이 시도:

MSI 패키지에는 동작 호출 "설치 후 응용 프로그램 시작"이 있습니다. 즉, MSI 설치 후에 EXE 파일이 실행됩니다 (MSI가 닫히면).

EXE가 다른 MSI 패키지를 호출하면 첫 번째 패키지와 충돌하지 않습니다.

Wix는 할 수 있습니다. 다음은 Wix 3.5에 대한 샘플 코드입니다.

<?xml version='1.0'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
   <Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555" 
        Name='My Setup' Language='1033' Version='1.0.0.0' 
        Manufacturer='Your company'>

    <Package Description='pak' InstallerVersion='200' Compressed='yes' />

    <Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
        <Directory Id="TempFolder">
            <Directory Id="INSTALLLOCATION" Name="~_tmpdir">
                <Component Id='MyComponent' DiskId='1' Guid=''>
                    <File Id="File0" Name="setup.exe" Source="setup.exe" />
                    <File Id="File1" Name="file1.txt" Source="file1.txt" />
                </Component>
            </Directory>
        </Directory>
    </Directory>

    <Feature Id='InstallFeature' Title='Install Feature' Level='1'>
        <ComponentRef Id='MyComponent' />
    </Feature>

    <!-- Run Action -->
    <CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred" 
                  FileKey="File0" ExeCommand="setup.exe param here"  
                  HideTarget="no" Impersonate="no" />

    <InstallExecuteSequence>
        <Custom Action="RunWrapExe" 
                After="InstallFiles">NOT REMOVE~="ALL"</Custom>
    </InstallExecuteSequence>

   </Product>
</Wix>

나는 같은 문제를 겪고있었습니다 (랩 exe, .NET 설정 등을 포함하여 EXE의 다른 MSI에 전화). 여기에 내 해결책이 있습니다.

InstallAware를 사용하여 설치 exe를 빌드합니다.생성된 EXE를 MSI로 래핑하는 자체 MSI 래퍼가 있습니다.

정상적으로 작동합니다. EXE는 문제 없이 다른 MSI를 호출할 수 있습니다(.net 설정, 기타 타사 설정 포함). 그러나 이는 MSI 시작이 설정 EXE 파일을 시작한 후 종료("반환") 권한을 가지기 때문입니다. 재귀 MSI 호출의 MSI 제한을 피합니다.

그러나 MSI 배포 도구를 사용하는 일부 고객(회사)에서는 설정 프로세스가 끝난 후에만 MSI(msiexec)가 반환(종료)되도록 요구하는데 이것이 위 해결 방법의 문제입니다.

그래서 - 이 문제를 해결하려면:

EXE 설정이 끝난 후에만 반환하는 MSI를 생성하는 또 다른 MSI 래퍼(exemsi.com)가 있지만 이를 사용하려면 InstallAware의 또 다른 고유 옵션을 사용해야 합니다.

InstallAware에는 MSI 재귀 제한을 피하기 위해 Windows Installer 엔진을 기반으로 하지 않고 자체 기본 엔진을 사용하여 EXE 설정을 생성하는 옵션이 있습니다.이 두 가지를 결합하면 완벽한 솔루션을 얻을 수 있습니다.

이 질문이 처음 게시된 지 수년이 지났지만 이것이 누군가에게 도움이 되기를 바랍니다.

간단한 속임수 :

프로젝트 이미지

using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;

namespace Setup
{
    internal class Program
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private static void Main(string[] args)
        {
            ShowWindow(GetConsoleWindow(), 0);
            Stream st = Assembly.GetExecutingAssembly().GetManifestResourceStream("Setup.MSI.Temp.msi");
            string path = Path.Combine(System.IO.Path.GetTempPath(), "Temp.msi");
            using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write))
            {
                st.CopyTo(fileStream);
            }
            Process p = new Process();
            p.StartInfo.FileName = path;
            p.Start();
            p.WaitForExit();
            File.Delete(path);
        }
    }
}

EXE 또는 폴더에서 MSI를 만들기 위해 간단하고 무료 .NET 도구를 만들었습니다 (WixSharp 및 Wix를 사용하고 있습니다).http://legacy.aversbouch.biz/free-msi-wrapper

screenshot

Nah Man, 그냥 Inno Setup의 마법사를 사용하십시오. 설정은 exe를 만들지 만 MSI는 아닙니다. 그것은 5 분과 같으며 Windows 설치 프로그램이 있습니다.

간단히 다운로드 그것은 그것을 설치하고, 당신의 exe를 가리키고, 화면 프롬프트를 따르십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top