La meilleure façon de vérifier si le fichier DLL est un assembly CLR en C#
Quelle est la meilleure façon de vérifier si le fichier DLL est une DLL Win32 ou si c'est un assembly CLR. En ce moment j'utilise ce code
try
{
this.currentWorkingDirectory = Path.GetDirectoryName(assemblyPath);
//Try to load the assembly.
assembly = Assembly.LoadFile(assemblyPath);
return assembly != null;
}
catch (FileLoadException ex)
{
exception = ex;
}
catch (BadImageFormatException ex)
{
exception = ex;
}
catch (ArgumentException ex)
{
exception = ex;
}
catch (Exception ex)
{
exception = ex;
}
if (exception is BadImageFormatException)
{
return false;
}
Mais je tiens à vérifier avant de charger parce que je ne veux pas de ces exceptions (le temps).
Est-il un meilleur moyen?
Vous devez vous connecter pour publier un commentaire.
Vérifier l'en-tête PE:
Réf.
Mise à JOUR: il y a un plus".NET pour cela:
Utilisation
Module.GetPEKind
méthode et de vérifier laPortableExecutableKinds
Énumération:Si une assemblée est chargé par exemple
Assembly.LoadFile(dotNetDllorExe)
et ne lance pas d'exception, c'est valide .NET de l'assemblée. Si c'est non, alors il va jeter une “BadImageFormatException”.L'idée de consulter la météo d'un fichier de l'assemblée ou non par le chargement et vérifier si une exception est levée ou non, ne semble pas être trop propre. Après toutes les exceptions sont censés être exceptionnellement.
.NET assemblées sont régulièrement Win32 PE fichiers, le Système d'exploitation ne peut pas les différencier .NET assemblées et Win32 fichiers binaires exécutables, ils sont de la même normal de fichiers PE. Alors, comment fonctionne le Système si une DLL ou EXE est géré assemblée, afin de charger le CLR?
Il valide le fichier d'en-tête pour vérifier si il est géré assemblée ou pas. Dans les Spécifications ECMA Partition II – les Métadonnées qui est livré avec .NET SDK que vous voyez là est séparée de la CLI d'en-Tête dans le Format PE. C'est le 15 répertoire des données dans le PE en Option en-Têtes. Donc, en termes simples, si nous avons de la valeur dans ce répertoire de données, alors cela signifie que ce est valide .NET de l'assemblée, sinon il ne l'est pas.
ECMA Ref, Blog Ref
Confrontés au même problème dans le passé, j'ai eu recours à l'aide de votre réflexion, car l'alternative est manuellement lire l'en-tête PE comme ceci. Semblait seulement overkill pour mon scénario, mais il peut être utile pour vous.
Vous n'avez pas de préciser si vous avez à faire dans le code, ou si vous avez personnellement besoin de savoir si un fichier que vous êtes en train de regarder sur votre système est un .NET de l'assemblée (qui peut-être vous pensez exige de vous d'écrire votre propre code pour le faire). Si ce dernier, vous pouvez utiliser Dependency Walker pour voir si il a une dépendance sur MSCOREE.dll qui est le .Net runtime.
Vous pouvez utiliser quelque chose comme:
Veuillez également consulter: https://msdn.microsoft.com/en-us/library/ms173100.aspx