我有一个应用程序,用 C++ 编写并用 VS 2010 编译。 我需要加载用 C# 编写并从 C++ 代码为 .net 4.0 平台编译的 .net dll 并调用一些函数。我已经通过 C++ CLR 完成了此操作,并且在系统中未安装 .net 4.0 之前,它的调用 .net 函数正常。
未安装 .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
问题:
- 是否可以从 C++ 代码中确定加载的 dll 的目标 .net 平台并确定系统中是否安装了此类平台?
- 也许有任何其他方法可以防止 SEH 异常并显示人类可读的错误解释?
提前致谢
最佳答案
确定目标程序集的 CLR 运行时版本的一种方法是在通过 .NET 加载程序(反射)加载 DLL 文件之前直接读取它的 header 。您需要检查 IMAGE_COR20_HEADER 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。
参见 How to detect what .NET Framework versions and service packs are installed? .
关于c# - C++ CLR 在未安装 .net 4.0 时加载 .net 4.0 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5186227/