Wie finde ich die alle Arten Abhängigkeiten eines bestimmten Typs in jedem Einbau COLOR basierte Sprache?
-
20-09-2019 - |
Frage
Ich versuche, alle die Typen zu finden, dass ein bestimmter Typ abhängig ist, einschließlich der Schnittstellen, abstrakte Klassen, Enumerationen, Strukturen, etc. Ich möchte eine Baugruppe laden und auszudrucken eine Liste aller Typen definiert innerhalb sie und ihre Abhängigkeiten.
Bisher habe ich in der Lage, alle die die externen Typen eine CLR zu finden, hängt Montage Mono.Cecil zur Verwendung, z.
using System;
using Mono.Cecil;
using System.IO;
FileInfo f = new FileInfo("SomeAssembly.dll");
AssemblyDefinition assemDef = AssemblyFactory.GetAssembly (f.FullName);
List<TypeReference> trList = new List<TypeReference>();
foreach(TypeReference tr in assemblyDef.MainModule.TypeReferences){
trList.Add(tr.FullName);
}
Diese Liste kann auch die Mono-disasembler erhalten werden, zB "monodis SomeAssembly.dll --typeref", aber diese nicht Liste scheinen Primitiven zu enthalten, zB System.Void, System.Int32, etc
Ich brauche jeden Typ einzeln zu behandeln, und alle Arten erhalten, dass eine bestimmte Art hängt davon ab, selbst wenn die Typen in derselben Assembly definiert sind. Gibt es eine Möglichkeit, dies mit Mono.Cecil zu tun, oder irgendein anderes Projekt?
Ich weiß, es kann durch das Laden der Montage durchgeführt werden, dann jeden definierten Typ iterieren, dann die IL des Typs Laden und es nach Referenzen scannen, aber ich bin sicher, dass es einen besseren Weg gibt. Im Idealfall wird es auch Arbeit mit anonymen inneren Klassen.
Es sollte auch funktionieren, wenn mehrere Module in der gleichen Baugruppe definiert sind.
Lösung
AJ, Ich hatte das gleiche Problem, dass ich brauchte, um die Typen in einer Baugruppe zu durchqueren, und ich ließ sich auf mit Mono.Cecil. Die Art und Weise konnte ich durch jede Klasse gehen, und wenn eine Eigenschaft in einer Klasse war nicht eine andere Klasse anstelle eines CLR-Typ wurde durch eine rekursive Funktion.
private void BuildTree(ModuleDefinition tempModuleDef , TypeDefinition tempTypeDef, TreeNode rootNode = null)
{
AssemblyTypeList.Add(tempTypeDef);
TreeNode tvTop = new TreeNode(tempTypeDef.Name);
// list all properties
foreach (PropertyDefinition tempPropertyDef in tempTypeDef.Properties)
{
//Check if the Property Type is actually a POCO in the same Assembly
if (tempModuleDef.Types.Any(q => q.FullName == tempPropertyDef.PropertyType.FullName))
{
TypeDefinition theType = tempModuleDef.Types.Where( q => q.FullName == tempPropertyDef.PropertyType.FullName)
.FirstOrDefault();
//Recursive Call
BuildTree(tempModuleDef, theType, tvTop);
}
TreeNode tvProperty = new TreeNode(tempPropertyDef.Name);
tvTop.Nodes.Add(tvProperty);
}
if (rootNode == null)
tvObjects.Nodes.Add(tvTop);
else
rootNode.Nodes.Add(tvTop);
}
Diese Funktion wird durch meine Hauptfunktion der Kern genannt wird, worin
public void Main()
{
AssemblyDefinition assemblyDef = AssemblyDefinition.ReadAssembly(dllname);
//Populate Tree
foreach (ModuleDefinition tempModuleDef in assemblyDef.Modules)
{
foreach (TypeDefinition tempTypeDef in tempModuleDef.Types)
{
BuildTree(tempModuleDef ,tempTypeDef, null);
}
}
}
Andere Tipps
Hier finden Sie aktuelle NDepend -. Es tut dies und vieles mehr
-Oisin