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. I have already done this through C++ CLR and its calling .net functions fine until .net 4.0 is not installed in the system.
When .net 4.0 is not installed any function call raises SEH exception in my c++ code, but library loading is successful. Every time exception code is the same 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:开发者_StackOverflow
- 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?
- Maybe there is any other way prevent SEH exception and show human readable error explanation?
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). You would want to check the MajorRuntimeVersion field from the IMAGE_COR20_HEADER header.
See http://ntcore.com/files/dotnetformat.htm and http://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx for more details.
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.
See How to detect what .NET Framework versions and service packs are installed?.
0xE0434F4D is the exception code for a managed exception. 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. Google CorBindToRuntimeEx to find the boilerplate code that's required.
Writing a better installer that ensures that .NET 4.0 is properly deployed on the machine might be a more fruitful plan of attack. It is really simple with a Setup project.
精彩评论