ICSharpCode rekursive DekompilierungC#

Ein Treffpunkt für C#-Programmierer
Guest
 ICSharpCode rekursive Dekompilierung

Post by Guest »

Ich verwende ICSharpCode, um Quellcode zu dekompilieren, um ihn für langwierige Berechnungen über die Leitung per gRPC an einen Server zu senden. Diese Simulationen implementieren eine Basisklassenoptimierung aus einer gemeinsam genutzten Bibliothek, die sowohl auf dem Client als auch auf dem Server verfügbar ist. Zum Beispiel:
class CustomOpt : Optimization
{
protected override double Run()
{
for (int x = 0; x < 10000000; x++)
{
//do some long-running calculations
}

return double.PositiveInfinity;
}
}

Ich kann CustomOpt problemlos dekompilieren, indem ich den Typ an diese Methode übergebe:
public static string GetSourceCode(Type type)
{
var location = Assembly.GetEntryAssembly().Location;
var decompiler = new CSharpDecompiler(location, new DecompilerSettings());
var customType = decompiler.TypeSystem.FindType(type);
var source = decompiler.DecompileAsString(customType.GetDefinition().MetadataToken);
return source;
}

Dies funktioniert hervorragend, bis der benutzerdefinierte Typ auf einen anderen Typ verweist, der nicht Teil von .NET oder der gemeinsam genutzten Bibliothek ist. Zum Beispiel:
class SomeHelperClass
{
public void DoSomething() { }
}

class CustomOpt2 : Optimization
{
protected override double Run()
{
var helper = new SomeHelperClass();

return double.NaN;
}
}

Wenn ich CustomOpt2 mithilfe der obigen Methode GetSourceCode(Type type) in die Quelle dekompiliere, gibt ICSharpCode zurück
private class CustomOpt2 : Optimization
{
protected override double Run()
{
SomeHelperClass someHelperClass = new SomeHelperClass();
return double.NaN;
}
}

Aber der Remote-Server beschwert sich, dass er nichts über SomeHelperClass weiß. Dies ist eine langwierige Fragestellung: Wie kann ich alle Typen abrufen, auf die innerhalb eines Typs verwiesen wird? Im Wesentlichen benötige ich eine rekursive Dekompilierung entlang der gesamten Vererbungskette, bis ich eine Klasse erreiche, die Teil von .NET oder der gemeinsam genutzten Bibliothek ist. Auf diese Weise kann ich Quellcode für SomeHelperClasss über die Leitung senden, damit der Server CustomOpt2 kompilieren kann.
Der Aufruf von IType.GetMembers() scheint Es scheint ein logischer Anfang zu sein, aber ich stecke fest. Kann jemand Vorschläge machen, wie man das angeht? Danke!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post