2011-03-03 3 views
0

저는 C++로 작성되었으며 VS 2010으로 컴파일 된 응용 프로그램을 가지고 있습니다. .net dll을 C#으로 작성하고 .net 4.0 플랫폼 용으로 컴파일해야합니다. C++ 코드를 작성하고 일부 함수를 호출하십시오. 이미 C++ CLR을 통해이 작업을 수행했으며 .net 4.0이 시스템에 설치되어 있지 않을 때까지 .net 함수를 호출 할 수있었습니다.C++ CLR 로딩 .net 4.0이 설치되지 않은 경우 .net 4.0이 설치되어 있지 않습니다.

.net 4.0이 설치되어 있지 않으면 함수 호출이 내 C++ 코드에서 SEH 예외를 발생 시키지만 라이브러리로드는 성공적입니다. 예외 코드는 항상 0xE0434F4D입니다.

KERNELBASE.dll!RaiseException() + 0x3d bytes 
mscorwks.dll!RaiseTheExceptionInternalOnly() + 0x295 bytes 
mscorwks.dll!UnwindAndContinueRethrowHelperAfterCatch() + 0x63 bytes 
mscorwks.dll!CorDllMainForThunk() + 0xcd bytes 
mscoree.dll!CorDllMainWorkerForThunk() + 0x62 bytes  
mscoree.dll!VTableBootstrapThunkInitHelper() + 0x12 bytes 
mscoree.dll!VTableBootstrapThunkInitHelperStub() + 0x3e bytes 
hs.exe!SrvAuth::PluginProxy::ProxyBody() Line 363 + 0x13 bytes C++ 
hs.exe!hs::hsThread::InvokableEntry(void * thread_obj=0x000000000024de90) Line 458 C++ 
msvcr100.dll!_callthreadstartex() Line 314 + 0xd bytes C 
msvcr100.dll!_threadstartex(void * ptd=0x0000000000000000) Line 292 + 0x5 bytes C 
kernel32.dll!BaseThreadInitThunk() + 0xd bytes 
ntdll.dll!RtlUserThreadStart() + 0x21 bytes  

질문 :

  1. 는 C++ 코드에서로드 된 DLL의 대상 .NET 플랫폼을 결정하기 위해 이러한 플랫폼은 시스템에 설치되어 있는지 확인 할 수 있습니까?
  2. 어쩌면 SEH 예외를 방지하고 사람이 읽을 수있는 오류 설명을 표시하는 다른 방법이 있습니까? 사전에

감사 대상 어셈블리의 CLR 런타임 버전을 확인하기 위해

답변

1

0xE0434F4D는 관리 예외의 예외 코드입니다. 그 코드를 얻을 즈음에는 이미 너무 늦었습니다. 예외가 처리되지 않았으므로 예외를 해석 할 수있는 라이브 코드가 없습니다. CLR 부팅의 초기 단계에서 오류 처리를 개선하려면 CLR을 직접 호스팅해야합니다. Google CorBindToRuntimeEx를 사용하면 필요한 상용구 코드를 찾을 수 있습니다.

.NET 4.0이 컴퓨터에 올바르게 배포되도록하는보다 나은 설치 관리자를 작성하면 더 많은 공격 계획이 생길 수 있습니다. 설치 프로젝트는 정말 간단합니다.

3

한 가지 방법은 .NET 로더 (반사)를 통해 그것을로드하기 전에 직접 DLL 파일의 헤더를 읽는 것입니다. MajorRuntimeVersion 필드를 IMAGE_COR20_HEADER 헤더에서 확인하고 싶을 것입니다.

자세한 내용은 http://ntcore.com/files/dotnetformat.htmhttp://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx을 참조하십시오.

는 .NET 4.0이 설치되어있는 경우, 당신은 키 레지스트리 HKLM \ 소프트웨어 \ 마이크로 소프트 \ NET 프레임 워크 설정 \ NDP \ V4의 존재를 확인할 수 있습니다 확인하십시오.

How to detect what .NET Framework versions and service packs are installed?을 참조하십시오.

관련 문제