Frage

Ich lade zwei Baugruppen mit AssembliyDefinition.readassembly

In Assemblya definiere ich Classa.

In AssemblyB definiere ich classB: classa.

Wenn ich die typedefinition.basetype von classB inspiziere, erhalte ich, dass sein Modul AssemblyB ist.

Ich würde erwarten, dass das Modul Assemblya wäre, da der Basistyp von classB Classa ist und in Assemblya definiert ist.

Dies wird für mich als Fehler angezeigt, da ich, wenn ich versuche, classb.basetype.resolve () zu machen, einen Fehler erhalte, der wahrscheinlich passiert, da es in der falschen Montage nach Classa sucht.

Irgendwelche Ideen jemand?

Vielen Dank

War es hilfreich?

Lösung

Ihre Erwartung ist falsch.

Cecil unterscheidet im Gegensatz zu System.reflexion und für ein Modul die Unterscheidung zwischen einem in diesem Modul definierten Typ: einer TypeDefinition und einem in einem anderen Modul definierten Typ: eine Typeeferenz.

Dies ist der Grund, warum Basetype eine Typeeferenzinstanz ist, und in Ihrem Fall befindet sich der Verweis auf Classa in AssemblyB. Wenn Sie sehen möchten, wo der Basetyp definiert ist und nicht wo er verwendet wird, müssen Sie die Tilger -Eigenschaft der Typeeferenz verwenden.

Wenn Sie einen Fehler in der Lösung haben, ist dies ein völlig anderes Problem. Aber dann zeigen Sie nichts darüber, was dieser Fehler ist. Wir müssen also vermuten, dass der Montage -Resolver nicht weiß, wo er nach Assemblya suchen soll. Und laut Ihrem Kommentar ist das der Fall. Folgendes können Sie tun:

var resolver = new DefaultAssemblyResolver ();
resolver.AddSearchDirectory ("path/to/AssemblyA");
resolver.AddSearchDirectory ("path/to/AssemblyB");

var a = AssemblyDefinition.ReadAssembly (
    "path/to/AssemblyA/AssemblyA.dll",
    new ReaderParameters { AssemblyResolver = resolver });

var b = AssemblyDefinition.ReadAssembly (
    "path/to/AssemblyB/AssemblyB.dll",
    new ReaderParameters { AssemblyResolver = resolver });

Auf diese Weise stellen Sie sicher, dass Ihre gesamte Versammlung einen gemeinsamen Resolver teilen, der weiß, wo Sie Ihre Baugruppen finden. Und Entschlossenheit wird gut funktionieren.

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