문제

자, 많은 연구를 수행하고 거의 모든 관리 된 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 만 파일 이름을 제외하고 예외로 채웠다면 더 쉬울 것입니다.

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