2011-03-03 3 views
0

J'ai une application, écrite en C++ et compilée avec VS 2010. J'ai besoin de charger .net dll écrit en C# et compilé pour la plate-forme .net 4.0 de C++ code et appelle certaines fonctions. Je l'ai déjà fait par C++ CLR et son. Net fonctionne bien jusqu'à ce que. Net 4.0 n'est pas installé dans le système.C++ CLR chargement .net 4.0 dll lorsque .net 4.0 n'est pas installé

Lorsque .net 4.0 n'est pas installé, tout appel de fonction déclenche une exception SEH dans mon code C++, mais le chargement de la bibliothèque est réussi. Chaque code d'exception de temps est le même 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:

  1. Est-il possible de déterminer la plate-forme cible de .net du dll chargé à partir du code C++ et pour déterminer si cette plate-forme installée dans le système?
  2. Peut-être existe-t-il un autre moyen d'empêcher l'exception SEH et d'afficher une explication d'erreur lisible par l'utilisateur?

Merci à l'avance

Répondre

1

0xE0434F4D est le code d'exception pour une exception gérée. Au moment où vous obtenez ce code, il est déjà trop tard. L'exception n'a pas été gérée, il ne reste plus de code en direct pour interpréter l'exception. L'amélioration de la gestion des erreurs à un stade si précoce du démarrage du CLR nécessite l'hébergement du CLR vous-même. Google CorBindToRuntimeEx pour trouver le code standard requis.

L'écriture d'un meilleur programme d'installation qui garantit que .NET 4.0 est correctement déployé sur la machine peut être un plan d'attaque plus fructueux. C'est vraiment simple avec un projet d'installation.

3

Une façon de déterminer la version d'exécution CLR de l'ensemble cible est de lire les en-têtes de fichier DLL directement avant de le charger via le chargeur .NET (réflexion). Vous souhaitez vérifier le champ MajorRuntimeVersion à partir de l'en-tête IMAGE_COR20_HEADER. Pour plus de détails, voir http://ntcore.com/files/dotnetformat.htm et http://www.codeproject.com/Articles/65181/From-Binary-to-Data-Structures.aspx.

Pour déterminer si .NET 4.0 est installé, vous pouvez vérifier la présence de la clé de Registre HKLM \ Software \ Microsoft \ Setup NET Framework \ NPD \ v4.

Voir How to detect what .NET Framework versions and service packs are installed?.