혼합 모드 라이브러리 및 CRT 종속성 - 도움말
-
04-07-2019 - |
문제
자, 많은 연구를 수행하고 거의 모든 관리 된 CPP Redist를 시도한 후 DLL을 앱의 실행 디렉토리로 로컬로 복사하려고 시도 할 수 있습니다.이 혼합 모드 라이브러리에 대해 누락 된 의존성을 알 수 없습니다.
기본적으로 큰 C# 응용 프로그램이 있으며 혼합 모드 라이브러리를 사용하려고합니다. 개발 기계에서는 완벽하게 작동하지만 (물론) CRT 종속성이 누락되어 예외를 사용하기 위해 라이브러리를로드해야 할 때 배포됩니다 (I).
나는 의존성 워커를 사용하여 모든 DLL을 확인하고 운이없는 배포 머신에 존재하는지 확인했는데, 내가 누락 된 등록 해야하는 일부 종속성인지 궁금합니다. .
코드가 혼합 모드 라이브러리에서 클래스를 인스턴스화하려고 할 때 다음과 같은 예외가 발생합니다.
예외 세부 사항 : System.io.fileloadexception : 파일 또는 어셈블리 'usadsi.mapi, 버전 = 1.0.3174.25238, Culture = Neutral, PublicKeyToken = null'또는 그 종속성 중 하나를로드 할 수 없습니다. 응용 프로그램 구성이 잘못 되었기 때문에이 응용 프로그램이 시작되지 않았습니다. 응용 프로그램을 다시 설치하면이 문제가 해결 될 수 있습니다. (HRESULT의 예외 : 0x800736B1)
/clr : Oldsyntax 지정된 VS2008 SP1을 사용하여 라이브러리를 컴파일하고 있습니다.
중간 매니페스트는 다음과 같습니다.
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
</assembly>
필요에 따라 더 많은 정보를 제공 할 수 있습니다. 불행히도 혼합 모드 라이브러리를 만드는 데 정통하지 않아서 저를 버렸습니다.
누구든지 조언을 제공 할 수 있다면 크게 감사하겠습니다!
해결책
배치 했습니까? CRT 라이브러리 대상 기계에서? Long Shot : 32 비트 코드에 종속성이 있으므로 빌드 속성 탭에서 대상 플랫폼을 x86으로 설정해야합니다.
편집 : 문제 해결 문제 sxstrace.exe 유틸리티, Vista에서 사용할 수 있습니다.
다른 팁
일반적으로 나는 그것을 발견했습니다 Pragma 댓글 Style Manifest Decleration은 개발자 유지 관리 및 모든 빌드 액션 관점에서 훨씬 더 많은 오류가 없습니다. XML 매니페스트는입니다 NATARY SNAFU.
링커 작동 방식과 C 코드의 일반적인 컴파일에 대한 fimiluarity와 소스 파일 중 하나에 이것을 간단히 잡아 당기는 사실은 모든 것을 조금 더 "함께"유지합니다.
#pragma comment(linker, \
"\"/manifestdependency:type='Win32' "\
"name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' "\
"processorArchitecture='*' "\
"publicKeyToken='6595b64144ccf1df' "\
"language='*'\"")
대상 시스템에 VS 2005 앱을 처음 배치했을 때 비슷한 문제가있었습니다. MSVCRT80 DLL을 가져와야했습니다. 이미 2008 대 런타임 라이브러리가 있다고 말하고 있습니까?
ETA : 또한 멍청한 질문이지만 CRT 런타임이 모두 있다고 확신합니까 (위에 링크). 그리고 .NET 런타임은 (아마도 3.5)에 대해 컴파일 한 것과 동일한 버전을 사용합니까? 당신은 아마 이미 이것을 알고있을 것입니다 (특히 점수를 고려할 때).
나는 그것을 많이 좋아하지 않지만 작동하는 것처럼 보이는 솔루션을 찾았습니다.
폴더를 복사해야했습니다.
Microsoft.VC90.CRT & Microsoft.VC90.MFC
보낸 사람 : 프로그램 파일 Microsoft Visual Studio 9.0 VC Redist x86
배포 된 애플리케이션 디렉토리에서 이것이 왜 작동하는지 알 수 없으며 재배포 가능성이 아무것도하지 않았습니다.
편집 : 매니페스트를 보면서 MFC 디렉토리를 복사 할 필요가 없습니다.
이 문제를 해결하는 가장 좋은 방법은 다음과 같은 과정에서 프로세스 모니터를 다운로드하는 것입니다.http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
프로세스 만 볼 수 있도록 필터를 추가하면 프로세스가 시도하는 모든 파일 액세스가 표시됩니다. 이것은 어떤 dll을 찾을 수 없는지 정확히 보여줍니다.
나는 같은 문제에 직면 할 때 항상 이것을 사용합니다. Microsoft 만 파일 이름을 제외하고 예외로 채웠다면 더 쉬울 것입니다.