2008-10-14 7 views
1

J'ai hérité d'une application .NET qui regroupe environ 100 DLL créées par deux équipes ou achetées auprès de fournisseurs. Je voudrais identifier rapidement si une DLL donnée est un assembly .NET ou un composant COM. Je me rends compte que je pourrais simplement invoquer ildasm sur chaque dll individuellement et noter si la DLL n'a pas un en-tête CLR valide, mais cette approche semble maladroite et difficile à automatiser.Identification des composants COM dans une application .NET

Répondre

3

Si vous souhaitez vous rapprocher du côté COM, tester des objets COM dans une DLL revient à rechercher une exportation nommée "DllGetClassObject". En effet, un objet COM in-proc est accédé par le moteur d'exécution COM en appelant DllGetClassObject() sur cette DLL.

Vous pouvez le faire à partir d'un fichier de commandes à l'aide DUMPBIN.EXE qui est livré avec Visual Studio comme suit:

dumpbin unknown.dll /exports | find "DllGetClassObject" 

La ligne de commande ci-dessus produira une ligne de texte si elle est une DLL non géré qui contient des objets COM, ou zéro octet de sortie sinon.

Vous pouvez faire cela par programme en chargeant chaque DLL et essayer de faire un GetProcAddress() sur ce point d'entrée. Voici un programme de ligne de commande C# testé et fonctionnel qui utilise cette technique:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

static class NativeStuff 
{ 
    [DllImport("kernel32.dll")] 
    public static extern IntPtr LoadLibrary(string dllToLoad); 

    [DllImport("kernel32.dll")] 
    public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); 

    [DllImport("kernel32.dll")] 
    public static extern bool FreeLibrary(IntPtr hModule); 
} 

namespace IsComDLL 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if ((args.Length == 0) || String.IsNullOrEmpty(args[0])) 
      { 
       Console.WriteLine("Give DLL name on command line"); 
       Environment.Exit(255); 
      } 

      IntPtr pDll = NativeStuff.LoadLibrary(args[0]); 
      if (pDll == IntPtr.Zero) 
      { 
       Console.WriteLine("DLL file {0} not found", args[0]); 
       Environment.Exit(256); 
      } 

      IntPtr pFunction = NativeStuff.GetProcAddress(pDll, "DllGetClassObject"); 
      int exitValue = 0; 
      if (pFunction == IntPtr.Zero) 
      { 
       Console.WriteLine("DLL file {0} does NOT contain COM objects", args[0]); 
      } 
      else 
      { 
       Console.WriteLine("DLL file {0} does contain COM objects", args[0]); 
       exitValue = 1; 
      } 

      NativeStuff.FreeLibrary(pDll); 

      Environment.Exit(exitValue); 
     } 
    } 
} 
3

Vous pouvez toujours essayer d'ajouter la colonne "Assembly Version" à la fenêtre de l'Explorateur, et notez ceux qui sont vides pour trouver les assemblys non-NET.

0
System.Reflection.Assembly.ReflectionOnlyLoadFrom("mydll.dll") 

renvoie une référence d'assembly valide à une DLL .NET mais génère une erreur pour une DLL COM.

Questions connexes