рдмреЗрд╢рдХ, рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд ILSpy, рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдбрд┐рд╕реНрдХ рдФрд░ рдлрд┐рд░ рдбрд┐рдХрдВрдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВред
рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИред
рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЬреАрд╡рди рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдУрдкреЗрдВрд╕рд╕реЛрд░реНрд╕ рдШрдЯрдХ рд╣реИрдВ, рдФрд░ рд╕реА # рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЖрд╕рд╛рди рд╣реИ :)
So.
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ
Nuget рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдкрдврд╝реЗрдВ
SqlDataReader, SQL рдХреНрд╡реЗрд░реА рддреБрдЪреНрдЫ рд╣реИ:
SELECT af.name, af.content FROM sys.assemblies a INNER JOIN sys.assembly_files af ON a.assembly_id = af.assembly_id
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛
рдпрд╛рдиреА
рдЕрд╕реЗрдВрдмрд▓реАрдбрд┐рдлрд╛рдЗрдирдореЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдЯреНрд╕ рд▓реЛрдб рдХрд░реЗрдВ
var _assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(new MemoryStream(rdr.GetSqlBytes(1).Value), pars);
rdr - рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл SqlDataReader рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА
public class SqlAssemblyObject { public string AssemblyName { get; set; } public SqlBytes Data { get; set; } }
рдЪреВрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдПрдВ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдпрд╛ рдЯреИрдмрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд╕рд╛рдЗрдЯреНрд╕, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ!
рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛

рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдЬреИрд╕реЗ TreeView рдореЗрдВ
foreach (var typeInAssembly in _assemblyDefinition.MainModule.Types) { if (typeInAssembly.IsPublic) { var node = new TreeNode(typeInAssembly.FullName); node.Tag = typeInAssembly; } treeView1.Nodes.Add(node); }
decompilation
рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рддреАрди рд▓рд╛рдЗрдиреЗрдВ! (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
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;
рд╕реНрд░реЛрдд рд╣реА, рдЬрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИрдпрд╣ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

рдереЛрдбрд╝рд╛ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрд╕реЗрдВрдмрд▓реА рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЭреВрда рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд░ рдпрджрд┐ рдЖрдк "рдорд╛рдереЗ рдкрд░" рд╡рд┐рдШрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдПрдХ рдЕрдкрдШрдЯрди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред
рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ ICSharpCode.Decompiler рдореЗрдВ рдПрдХ рдЕрд╕реЗрдВрдмрд▓реА рд╣реИред)
рдЖрдЗрдП рд╣рдорд╛рд░реА рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд┐рдд SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рд▓рд┐рдЦреЗрдВред
public class DatabaseAssemblyResolver : IAssemblyResolver { List<SqlAssemblyObject> _databaseLibs; DefaultAssemblyResolver _resolver; public DatabaseAssemblyResolver(List<SqlAssemblyObject> dlls) { _databaseLibs = dlls; _resolver = new DefaultAssemblyResolver(); } public void Dispose() {
рдЪрд░
_listItems sys.assembly_files рд╕реЗ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ
var pars = new ReaderParameters(); pars.AssemblyResolver = new DatabaseAssemblyResolver(_listItems); _assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(new MemoryStream(_listItems[idx].Data.Value), pars);
рдЕрдм рдЬрдм рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдкреБрдирд╢реНрдЪ: рд▓рд┐рд▓реА рдЬреЗрдореНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред