c# - C++ CLR 在未安装 .net 4.0 时加载 .net 4.0 dll

标签 c# c++ unmanaged loadlibrary clr4.0

我有一个应用程序,用 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    

问题:

  1. 是否可以从 C++ 代码中确定加载的 dll 的目标 .net 平台并确定系统中是否安装了此类平台?
  2. 也许有任何其他方法可以防止 SEH 异常并显示人类可读的错误解释?

提前致谢

最佳答案

确定目标程序集的 CLR 运行时版本的一种方法是在通过 .NET 加载程序(反射)加载 DLL 文件之前直接读取它的 header 。您需要检查 IMAGE_COR20_HEADER 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

参见 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/

相关文章:

c# - 更新 GUI 形式单独类

c# - 在 .netstandard 2.0 上迁移后无法编译简单的动态代码(CodeDom 抛出 System.PlatformNotSupportedException)

c++ - 如何同步接收到的每 20 毫秒更新一次的图像?

.net - native 代码和托管代码之间的区别?

c# - AssertFailedException 在单元测试中是否有任何特殊处理?

c# - 无边框样式的表单

c++ - 为什么在 try block 中初始化文件指针会导致管道损坏?

c++ - 标量类型是否包括类类型的指针?

c# - C#中使用非托管指针初始化数组数组

c# - 如何正确地将 char * 从非托管 DLL 返回到 C#?