문제

VS 2005 이후로는 단순히 MS 런타임에 대해 dll을 빌드하고 함께 배포하는 것이 불가능하다는 것을 알았습니다.http://www.ddj.com/windows/184406482).나는 매니페스트, SxS 및 공동으로 인해 매우 혼란스러워합니다.MSDN 문서는 순환 참조가 포함되어 있어 매우 열악합니다.특히 나는 유닉스 사용자이기 때문에 그 모든 것이 유익하지 않다고 생각합니다.내 핵심 문제는 msvc9 또는 msvc8에 대해 dll을 연결하는 것입니다.해당 런타임은 재배포가 불가능하므로 이러한 dll을 연결하고 배포하는 단계는 무엇입니까?특히, 매니페스트는 어떻게 생성되고(나는 mt.exe를 원하지 않고, 컴파일러 간에 이식 가능한 것을 원합니다) 어떻게 내장되고 사용됩니까?나란히 조립하다은 무슨 뜻인가요?

기본적으로 MS 전문 용어 대신 모든 종류의 사양을 어디에서 찾을 수 있습니까?

답변해주신 모든 분들께 감사드립니다. 정말 도움이 되었습니다.

도움이 되었습니까?

해결책

모든 애플리케이션 및 DLL에서 간단한 포함 파일인 vcmanifest.h를 사용한 다음 매니페스트 파일을 포함하도록 모든 프로젝트를 설정합니다.

vcmanifest.h

/*----------------------------------------------------------------------------*/

#if _MSC_VER >= 1400

/*----------------------------------------------------------------------------*/

#pragma message ( "Setting up manifest..." )

/*----------------------------------------------------------------------------*/

#ifndef _CRT_ASSEMBLY_VERSION
#include <crtassem.h>
#endif 

/*----------------------------------------------------------------------------*/

#ifdef WIN64
    #pragma message ( "processorArchitecture=amd64" )
    #define MF_PROCESSORARCHITECTURE "amd64"
#else
    #pragma message ( "processorArchitecture=x86" )
    #define MF_PROCESSORARCHITECTURE "x86"
#endif 

/*----------------------------------------------------------------------------*/

#pragma message ( "Microsoft.Windows.Common-Controls=6.0.0.0") 
#pragma comment ( linker,"/manifestdependency:\"type='win32' " \
                  "name='Microsoft.Windows.Common-Controls' " \
                  "version='6.0.0.0' " \
                  "processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
                  "publicKeyToken='6595b64144ccf1df'\"" )

/*----------------------------------------------------------------------------*/

#ifdef _DEBUG
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "         \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif

/*----------------------------------------------------------------------------*/

#ifdef _MFC_ASSEMBLY_VERSION
    #ifdef _DEBUG
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #else
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #endif
#endif /* _MFC_ASSEMBLY_VERSION */

/*----------------------------------------------------------------------------*/

#endif /* _MSC_VER */

/*----------------------------------------------------------------------------*/

다른 팁

가장 간단한 방법은 다음과 같습니다.VS2005의 기본 설치를 가정하면 다음과 같은 경로가 표시됩니다.

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

가서 이 redist 폴더에 있는 파일을 가져와서 .manifest와 msvcr80.dll(적어도)을 응용 프로그램 .exe 폴더에 넣으세요.설치 루트에 있는 이러한 파일을 사용하면 exe와 이에 연결된 모든 dll이 병합 모듈, MSI 또는 실제로 런타임이 설치되지 않은 모든 종류의 적시 감지에 의존하지 않고도 완벽하게 작동할 수 있습니다.

블로그 항목은 다음과 같습니다. VC++에 대한 SxS crt 결정의 근거를 설명합니다..여기에는 crt를 정적으로 연결하는 것이 얼마나 나쁜지, 그리고 그렇게 하면 안되는 이유에 대한 설명이 포함됩니다.

여기는 crt를 정적으로 연결하는 방법에 대한 문서.

글쎄, 나는 이러한 문제 중 일부에 직면했으므로 아마도 내 의견 중 일부가 도움이 될 것입니다.

  1. 매니페스트는 xml 파일입니다.VS는 사용자가 컴파일할 때 하나를 만들 수 있고 만들 것이지만, 다른 솔루션은 VS에 포함된 리소스 컴파일러(rc.exe)를 사용하여 리소스 파일(.rc)을 생성하고 이를 컴파일된 리소스 파일(.res)로 컴파일하는 것입니다. .도구 메뉴에서 VS 명령줄을 실행하면 rc가 경로에 있고 다양한 환경 변수가 올바르게 설정됩니다.그런 다음 리소스를 컴파일하십시오.결과 .res 파일은 다른 컴파일러에서 사용할 수 있습니다.
  2. 매니페스트 xml 파일의 크기가 4로 나누어지는지 확인하세요.필요한 경우 이를 달성하려면 중간에 공백을 추가하세요.여는 xml 태그 앞이나 닫는 xml 태그 뒤에 문자가 없도록 하십시오.나는 때때로 이것에 문제가 있었습니다.2단계를 잘못 수행하면 병렬 구성 오류가 발생할 수 있습니다.리소스 편집기(예:devenv.exe) 및 매니페스트 리소스를 검사합니다.빌드된 파일을 열어서 올바른 매니페스트의 예를 볼 수도 있지만, dll과 exes는 리소스에 부여해야 하는 ID에 약간의 차이가 있습니다.

이것이 제대로 작동하는지 확인하기 위해 Vista에서 테스트해 볼 수도 있습니다.

재배포 가능하며 msvs 디렉터리 내에 재배포 가능 패키지가 있습니다.

선택한 런타임으로 빌드하고 해당 패키지를 설치 프로그램에 추가하면 걱정하지 않아도 됩니다. 작동할 것입니다.차이점은 – 그들은 설치됨 지금은 다른 장소에 있습니다(하지만 앱이 라이브러리를 찾는 곳이기도 합니다).

그렇지 않으면 MSDN이나 기본적으로 Windows C++ 프로그래밍에 관한 그리 오래되지 않은 책을 읽으세요.

답변 해주셔서 감사합니다.배포 자체의 경우 3가지 옵션이 표시됩니다.

  • .msi 병합 지시문을 사용합니다.
  • 재배포 가능 VS 패키지를 사용하여 내 설치 프로그램보다 먼저 실행
  • 재배포 가능 항목 복사 파일 내 신청서에 따라.하지만 이 경우 파일 시스템 계층 구조에서 이를 어떻게 참조합니까(예: bar/foo1/foo1.dll 및 bar/foo2/foo2.dll은 bar/의 msvcr90.dll을 참조함)?내 말은 명백하고 추악한 "dll에 의존하는 dll이 있는 모든 디렉터리에 dll을 복사하세요."라는 뜻입니다.

MSI에서 "InstallFinalize" 작업 전에 시작하려는 서비스나 실행하려는 프로그램이 있는 경우 Vista 및 Windows Server 2008에서 VC++8 SP1/9 CRT를 병합 모듈로 사용할 수 없습니다.

이는 "InstallFinalize" 작업을 통해 WinSXS에 DLL이 설치되기 때문입니다.

그러나 MSI "ServiceStart" 작업이 이 작업보다 먼저 옵니다.

따라서 부트스트래퍼를 사용하십시오. "http://www.davidguyer.us/bmg/publish.htm"

또는 설치 프로그램 4.5에서 설치 프로그램 연결을 사용해 보세요.하지만 이는 4.5를 설치하려면 부트스트래퍼가 필요하다는 의미이므로 약간 무의미해 보입니다.

Microsoft DLL/.manifest 파일을 배포하고 Java JNI를 사용하는 경우 해당 파일을 JDK/JRE의 bin 디렉터리에 넣어야 합니다.

JBoss에서 앱을 실행하는 경우 해당 앱을 JBoss/bin 디렉터리에 넣어야 합니다.

애플리케이션에 적합한 위치에 JNI DLL을 넣을 수 있습니다.

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