>

VS2015으로 컴파일 된 내 앱은 타사 DLL (VS2008으로 컴파일)을로드합니다. 릴리스에서 앱을 실행하려면 대상 컴퓨터의 MS 웹 페이지에서 VS2008 및 VS2015 용 재배포 가능 파일 만 필요합니다.

디버그 모드에서 (예 : 다른 개발자 컴퓨터에서) 앱을 실행하려면 VS2008의디버그재배포 가능 파일이 필요하므로 피해야합니다. 타사 DLL 옆에 msvcX90d.dll을 복사해도 성공하지 못합니다. Windows에서 VS2008 디버그 런타임을로드하도록 설득하는 방법에 대한 아이디어가 있습니까? 애플리케이션에 매니페스트가 필요하고 어떤 매니페스트가 필요합니까?

런타임 혼합에 대한 참고 사항

예, 혼합 런타임에 만족하지는 않지만 제 컨텍스트에서 두 런타임은 서로 통합되지 않습니다. 타사 DLL을 다시 컴파일하는 것은 옵션이 아닙니다.

문제를 훨씬 더 단순화합니다. VS2015 컴파일 응용 프로그램에서 msvcr90d.dll을 어떻게로드 할 수 있습니까?

LoadLibrary(L"msvcr90d.dll");


  • 답변 # 1

    댓글에서 많은 자료를 읽은 후 VS2015 (릴리스 및 디버그)에서 VS2008 (msvcr90d.dll)의 재배포 가능 파일을로드하는 방법에 대한 접근 방식입니다.

    먼저 응용 프로그램에 매니페스트 파일이 필요합니다. 매니페스트 파일이란 무엇입니까? 이 페이지는 다음과 같이 요약합니다 : http://www.samlogic.net/articles/manifest.htm

    와이즈 비즈

    실행 파일 옆에 매니페스트 파일을 배치하거나 내장 (기본)합니다. 전환/변경하려면

    A manifest is a XML file that contains settings that informs Windows how to handle a program when it is started. The manifest can be embedded inside the program file (as a resource) or it can be located in a separate external XML file.

    로 이동하십시오. .

    <올>

    아래 소스의 pragma는 기본적으로 포함 된 매니페스트 파일에 실행 파일에 몇 줄을 추가합니다.

    와이즈 비즈로 이동  실행 파일 옆에있는 모든 파일을 복사하십시오

    새로운 Projects Property Page -> Linker -> Manifest Tool -> Input and Output -> Embed Manifest 를여십시오   C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\amd64\Microsoft.VC90.DebugCRT 토큰을 제거하십시오. . 내부에 있으면, Windows는 msvcr90d.dll의 로딩을 계속 거부합니다. 이유를 묻지 마십시오.

    프로그램 컴파일 및 실행

    Microsoft.VC90.DebugCRT.manifest
    
    

    배경 왜 외부 매니페스트 파일 (Microsoft.VC90.DebugCRT.manifest)과이 솔루션에 대한 내장 파일 (pragma를 통해)이 있습니까? pragma는 매니페스트의 모양이 제한된 옵션 만 제공하는 것 같습니다. 한 가지 옵션은 추가 정보가 포함 된 다른 매니페스트 파일을 참조하는 것입니다.

    편집 :이 MSDN의 답변은 여기 링크 설명을 입력하면 많은 도움이되었습니다.

    편집 2 :포함 된 매니페스트에서 외부 publicKeyToken="1fc8b3b9a1e18e3b" 를 참조하는 대신 , 이미이 파일을 실행 파일에 포함시킬 수 있지만 (속성 페이지에서 수행 할 수도 있음)이 결론에 너무 늦었지만 초기 솔루션에서 더 많은 통찰력을 얻었습니다.

  • 답변 # 2

    방금 해결했습니다. 타사 DLL을 매니페스트와 포함시켜 비슷한 문제가 발생했습니다.

    실행은 제 3 자 DLL에 따라 다르며 C : \ Windows \ System32에서 msvcr90.dll을 찾고 있음을 보여주었습니다. 분명히 올바른 위치는 아닙니다. WinSxS 폴더 중 하나를보고 있어야합니다.

    운 좋게도, 제 3 자 DLL의 경우 소스 코드와 원본 메이크 파일이 있었으므로 올바른 매니페스트 파일을 생성하고 mt 명령을 사용하여 DLL에 포함시킬 수있었습니다.

    #include <Windows.h> #pragma comment(linker,"/manifestdependency:\"type='win32' "\ "name='Microsoft.VC90.DebugCRT' "\ "version='9.0.21022.8' "\ "processorArchitecture='amd64' "\ "\"") int main() { auto* lib = LoadLibrary(L"msvcr90d.dll"); if (!lib) { return -1; } FreeLibrary(lib); return 0; }

    그 후에 DLL을 올바로로드 할 수 있었고 R6034 오류가 사라졌습니다.

    Microsoft.VC90.DebugCRT.manifest

  • 이전 gun - GunDB로 p2p 트위터 클론을 어떻게 구축 하시겠습니까?
  • 다음 git - 중복 된 gitconfig 항목으로 인해 푸시 실패