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
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);
}
}
}
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.
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.
- 1. Publication des composants COM
- 2. Incorporation de composants COM dans une application AIR?
- 3. Identification des problèmes de mémoire dans une application ASP.NET
- 4. COM-Free COM dans une application ASP.Net
- 5. Comment gérer les objets COM dans une application Web .Net
- 6. Activation sans enregistrement des composants COM
- 7. Excel COM - .NET COM AddIn se comporte différemment lorsque Excel est incorporé dans une application
- 8. Dérivation interfaces COM dans .NET
- 9. Interface COM IRAPIStream dans .NET
- 10. Synchronisation des threads COM avec .NET
- 11. Utilisation de composants flex dans une application papervision3d
- 12. Existe-t-il un moyen d'activer gratuitement l'enregistrement des composants EXE COM
- 13. Identification des correspondances manquantes dans une base de données Mysql
- 14. Exécution de composants SWT dans une application Swing
- 15. Profiling Bibliothèques COM utilisées à partir d'une application .NET
- 16. Profilage d'une application COM?
- 17. Créer une instance de classe COM dynamiquement dans .NET
- 18. en utilisant des classes dans un COM exe de .Net
- 19. Comment gérer l'accès COM dans une application ASP.NET
- 20. .net Objet COM + renvoyant IDataReader
- 21. Obtenir des données de force dans une application .NET
- 22. Réutilisation des composants entre ASP.NET et C# .NET
- 23. .NET force Objets COM version
- 24. Identification des exceptions en double pour le suivi des bogues
- 25. Contrôle de substitution dans une application .net
- 26. Évolutivité, performance dans une application web .net
- 27. Comment joindre mon application dans une autre application .Net?
- 28. Comment redémarrer une application COM + sur un serveur distant à partir de .NET?
- 29. Comment sérialiser un objet COM dans .Net?
- 30. Recommandations - Programmation de logiciels/composants .Net