C ++ CLR загрузка .net 4.0 dll, когда .net 4.0 не установлен - PullRequest
0 голосов
/ 03 марта 2011

У меня есть приложение, написанное на c ++ и скомпилированное с VS 2010. Мне нужно загрузить .net dll, написанную на C # и скомпилированную для платформы .net 4.0 из кода c ++, и вызвать некоторые функции.Я уже сделал это через C ++ CLR и его вызывающие .net функционируют нормально, пока .net 4.0 не установлен в системе.

Когда .net 4.0 не установлен, любой вызов функции вызывает исключение SEH в моем коде c ++,но загрузка библиотеки прошла успешно.Каждый раз, когда код исключения одинаков. 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. Можно ли определить целевую платформу .net загруженной библиотеки DLL из кода C ++ и определить, так ли этоПлатформа установлена ​​в системе?
  2. Может быть, есть какой-нибудь другой способ предотвратить исключение SEH и показать понятное человеку объяснение ошибки?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 03 марта 2011

Один из способов определить версию среды CLR для целевой сборки - это прочитать заголовки DLL-файла непосредственно перед его загрузкой через загрузчик .NET (отражение).Вы хотите проверить поле MajorRuntimeVersion из заголовка IMAGE_COR20_HEADER.

Подробнее см. 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 .

См. Как определить, какие версии .NET Frameworkа сервис-паки установлены? .

2 голосов
/ 04 марта 2011

0xE0434F4D - код исключения для управляемого исключения.К тому времени, когда вы получите этот код, уже слишком поздно.Исключение было обработано, не осталось действующего кода для интерпретации исключения.Улучшение обработки ошибок на такой ранней стадии загрузки CLR требует самостоятельного размещения CLR.Google CorBindToRuntimeEx, чтобы найти стандартный код, который требуется.

Написание лучшего установщика, обеспечивающего правильное развертывание .NET 4.0 на компьютере, может быть более плодотворным планом атаки.Это действительно просто с проектом установки.

...