C++ CLR загрузка.net 4.0 dll, когда.net 4.0 не установлен
У меня есть приложение, написанное на 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
Вопросы:
- Можно ли определить целевую платформу.net загруженной библиотеки DLL из кода C++ и определить, установлена ли такая платформа в системе?
- Может быть, есть какой-то другой способ предотвратить исключение SEH и показать понятное человеку объяснение ошибки?
заранее спасибо
2 ответа
0xE0434F4D - код исключения для управляемого исключения. К тому времени, когда вы получите этот код, уже слишком поздно. Исключение было обработано, не осталось действующего кода для интерпретации исключения. Улучшение обработки ошибок на такой ранней стадии загрузки CLR требует самостоятельного размещения CLR. Google CorBindToRuntimeEx, чтобы найти стандартный код, который требуется.
Написание лучшего установщика, обеспечивающего правильное развертывание.NET 4.0 на компьютере, может быть более плодотворным планом атаки. Это действительно просто с проектом установки.
Один из способов определить целевую версию 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 и пакеты обновления установлены?,