繁体   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