簡體   English   中英

未安裝.net 4.0時C ++ CLR加載.net 4.0 dll

[英]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    

問題:

  1. 是否可以從C ++代碼確定加載的dll的目標.net平台,並確定系統中是否安裝了該平台?
  2. 也許還有其他方法可以防止SEH異常並顯示人類可讀的錯誤說明?

提前致謝

確定目標程序集的CLR運行時版本的一種方法是,在通過.NET加載程序加載該DLL文件的標頭之前,直接讀取它的標頭(反射)。 您可能想從IMAGE_COR20_HEADER標頭中檢查MajorRuntimeVersion字段。

有關更多詳細信息,請參見http://ntcore.com/files/dotnetformat.htmhttp://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx

要確定是否安裝了.NET 4.0,您可以檢查注冊表項HKLM \\ Software \\ Microsoft \\ NET Framework Setup \\ NDP \\ v4的存在

請參閱如何檢測安裝了哪些.NET Framework版本和Service Pack?

0xE0434F4D是托管異常的異常代碼。 到您獲得該代碼時,已經為時已晚。 未處理該異常,沒有任何活動代碼可以解釋該異常。 在CLR啟動的早期階段,改善錯誤處理需要自己托管CLR。 Google CorBindToRuntimeEx查找所需的樣板代碼。

編寫更好的安裝程序以確保.NET 4.0正確部署在計算機上可能是更有效的攻擊計划。 安裝項目真的很簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM