简体   繁体   English

未安装.net 4.0时C ++ CLR加载.net 4.0 dll

[英]C++ CLR loading .net 4.0 dll when .net 4.0 is not installed

I have an application, written on c++ and compiled with VS 2010. I need to load .net dll written on C# and compiled for .net 4.0 platform from c++ code and call some functions. 我有一个用C ++编写并用VS 2010编译的应用程序。我需要从C ++代码加载用C#编写并为.net 4.0平台编译的.net dll,并调用一些函数。 I have already done this through C++ CLR and its calling .net functions fine until .net 4.0 is not installed in the system. 我已经通过C ++ CLR做到了这一点,并且它的调用.net函数很好,直到未在系统中安装.net 4.0为止。

When .net 4.0 is not installed any function call raises SEH exception in my c++ code, but library loading is successful. 未安装.net 4.0时,任何函数调用都会在我的c ++代码中引发SEH异常,但库加载成功。 Every time exception code is the same 0xE0434F4D. 每次异常代码都是相同的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    

Questions: 问题:

  1. Is it possible to determine target .net platform of the loaded dll from C++ code and to determine if such platform installed in the system? 是否可以从C ++代码确定加载的dll的目标.net平台,并确定系统中是否安装了该平台?
  2. Maybe there is any other way prevent SEH exception and show human readable error explanation? 也许还有其他方法可以防止SEH异常并显示人类可读的错误说明?

Thanks in advance 提前致谢

One way to determine the CLR runtime version of the target assembly is to read the DLL file's headers directly before loading it via the .NET loader (reflection). 确定目标程序集的CLR运行时版本的一种方法是,在通过.NET加载程序加载该DLL文件的标头之前,直接读取它的标头(反射)。 You would want to check the MajorRuntimeVersion field from the IMAGE_COR20_HEADER header. 您可能想从IMAGE_COR20_HEADER标头中检查MajorRuntimeVersion字段。

See http://ntcore.com/files/dotnetformat.htm and http://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx for more details. 有关更多详细信息,请参见http://ntcore.com/files/dotnetformat.htmhttp://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx

To determine if .NET 4.0 is installed, you can check for the presence of the registry key HKLM\\Software\\Microsoft\\NET Framework Setup\\NDP\\v4 . 要确定是否安装了.NET 4.0,您可以检查注册表项HKLM \\ Software \\ Microsoft \\ NET Framework Setup \\ NDP \\ v4的存在

See How to detect what .NET Framework versions and service packs are installed? 请参阅如何检测安装了哪些.NET Framework版本和Service Pack? .

0xE0434F4D is the exception code for a managed exception. 0xE0434F4D是托管异常的异常代码。 By the time you get that code it is already too late. 到您获得该代码时,已经为时已晚。 The exception was unhandled, there's no live code left to interpret the exception. 未处理该异常,没有任何活动代码可以解释该异常。 Improving error handling at such an early stage of the CLR booting up requires hosting the CLR yourself. 在CLR启动的早期阶段,改善错误处理需要自己托管CLR。 Google CorBindToRuntimeEx to find the boilerplate code that's required. Google CorBindToRuntimeEx查找所需的样板代码。

Writing a better installer that ensures that .NET 4.0 is properly deployed on the machine might be a more fruitful plan of attack. 编写更好的安装程序以确保.NET 4.0正确部署在计算机上可能是更有效的攻击计划。 It is really simple with a Setup project. 安装项目真的很简单。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM