Wie finde ich die alle Arten Abhängigkeiten eines bestimmten Typs in jedem Einbau COLOR basierte Sprache?

StackOverflow https://stackoverflow.com/questions/2061992

  •  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.

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top