Tentu saja, Anda dapat mengambil utilitas pihak ketiga, misalnya, beberapa ILSpy open source, menyimpan perakitan ke disk dan kemudian mendekompilasi.
Tapi saya hanya ingin terhubung ke database dan melihat semua majelis dan apa yang ada di dalamnya.
Dan selain itu, ada banyak komponen opensource berkualitas tinggi untuk semua kasus kehidupan pemrograman, dan menulis dalam C # adalah mudah dan mudah :)
Jadi
Untuk ini kita membutuhkan
paket NugetBaca semua majelis dari database
SqlDataReader, kueri SQL sepele:
SELECT af.name, af.content FROM sys.assemblies a INNER JOIN sys.assembly_files af ON a.assembly_id = af.assembly_id
Inisialisasi perakitan
yaitu memuat byte kami ke dalam kelas
AssemblyDefinition var _assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(new MemoryStream(rdr.GetSqlBytes(1).Value), pars);
rdr - ini hanya SqlDataReader, tetapi Anda dapat membaca semua rakitan menjadi daftar, misalnya, daftar objek dari kelas sederhana
public class SqlAssemblyObject { public string AssemblyName { get; set; } public SqlBytes Data { get; set; } }
Karena biasanya ada banyak majelis, mudah untuk menampilkannya dalam bentuk daftar atau tablet, tetapi bagian dalamnya dalam bentuk pohon, tentu saja!
Sesuatu seperti ini akan menjadi norma

Kami menampilkan
mis. di TreeView
foreach (var typeInAssembly in _assemblyDefinition.MainModule.Types) { if (typeInAssembly.IsPublic) { var node = new TreeNode(typeInAssembly.FullName); node.Tag = typeInAssembly; } treeView1.Nodes.Add(node); }
Dekompilasi
Hanya tiga baris kode! (misalnya, saya lakukan di acara
treeView1_AfterSelect )
var decompiler = new ICSharpCode.Decompiler.CSharp.CSharpDecompiler(_assemblyDefinition.MainModule, new DecompilerSettings()); var str = decompiler.DecompileAsString(e.Node.Tag as IMemberDefinition); textbox1.Text = str;
Sumbernya sendiri, tempat semuanya disatukanSepertinya ini pada akhirnya

Sedikit tentang jebakan
Secara alami, majelis dapat bergantung pada majelis, dan semua ini bisa terletak pada database SQL.
Kemudian jika Anda mendekompilasi "pada dahi" - akan ada kesalahan dekompilasi.
Menghindari itu mudah (karena ada AssemblyResolver di ICSharpCode.Decompiler):
Mari kita menulis resolver kita hanya dengan memberikan semua rakitan yang tersedia di database SQL yang dianalisis:
public class DatabaseAssemblyResolver : IAssemblyResolver { List<SqlAssemblyObject> _databaseLibs; DefaultAssemblyResolver _resolver; public DatabaseAssemblyResolver(List<SqlAssemblyObject> dlls) { _databaseLibs = dlls; _resolver = new DefaultAssemblyResolver(); } public void Dispose() {
Variabel
_listItems hanyalah daftar semua majelis dari
sys.assembly_files var pars = new ReaderParameters(); pars.AssemblyResolver = new DatabaseAssemblyResolver(_listItems); _assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(new MemoryStream(_listItems[idx].Data.Value), pars);
Sekarang, ketika mendekompilasi, semua dependensi dapat diatasi!

PS: Lily James digunakan untuk menarik perhatian.