[英]BadImageFormatException occurring when loading a native DLL in .NET 4.0
[英]C++ CLR loading .net 4.0 dll when .net 4.0 is not installed
我有一個用C ++編寫並用VS 2010編譯的應用程序。我需要從C ++代碼加載用C#編寫並為.net 4.0平台編譯的.net dll,並調用一些函數。 我已經通過C ++ CLR做到了這一點,並且它的調用.net函數很好,直到未在系統中安裝.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
問題:
提前致謝
確定目標程序集的CLR運行時版本的一種方法是,在通過.NET加載程序加載該DLL文件的標頭之前,直接讀取它的標頭(反射)。 您可能想從IMAGE_COR20_HEADER標頭中檢查MajorRuntimeVersion字段。
有關更多詳細信息,請參見http://ntcore.com/files/dotnetformat.htm和http://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx 。
要確定是否安裝了.NET 4.0,您可以檢查注冊表項HKLM \\ Software \\ Microsoft \\ NET Framework Setup \\ NDP \\ v4的存在 。
0xE0434F4D是托管異常的異常代碼。 到您獲得該代碼時,已經為時已晚。 未處理該異常,沒有任何活動代碼可以解釋該異常。 在CLR啟動的早期階段,改善錯誤處理需要自己托管CLR。 Google CorBindToRuntimeEx查找所需的樣板代碼。
編寫更好的安裝程序以確保.NET 4.0正確部署在計算機上可能是更有效的攻擊計划。 安裝項目真的很簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.