Browse Source

Print XML security declarations as blob like ildasm does.

pull/1030/head
Siegfried Pammer 7 years ago
parent
commit
5af952dc37
  1. 98
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

98
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -370,57 +370,62 @@ namespace ICSharpCode.Decompiler.Disassembler
output.Write(secdecl.Action.ToString()); output.Write(secdecl.Action.ToString());
break; break;
} }
var blob = metadata.GetBlobReader(secdecl.PermissionSet);
if (AssemblyResolver == null) { if (AssemblyResolver == null) {
output.Write(" = "); output.Write(" = ");
WriteBlob(secdecl.PermissionSet, metadata); WriteBlob(blob);
output.WriteLine();
} else if ((char)blob.ReadByte() != '.') {
blob.Reset();
output.WriteLine();
output.Indent();
output.Write("bytearray");
WriteBlob(blob);
output.WriteLine();
output.Unindent();
} else { } else {
output.WriteLine(" = {"); output.WriteLine(" = {");
output.Indent(); output.Indent();
var blob = metadata.GetBlobReader(secdecl.PermissionSet);
if ((char)blob.ReadByte() != '.') {
blob.Reset();
WriteXmlSecurityDeclaration(blob.ReadUTF8(blob.RemainingBytes));
} else {
string currentAssemblyName = null;
string currentFullAssemblyName = null;
if (metadata.IsAssembly) {
currentAssemblyName = metadata.GetString(metadata.GetAssemblyDefinition().Name);
currentFullAssemblyName = metadata.GetFullAssemblyName();
}
int count = blob.ReadCompressedInteger();
for (int i = 0; i < count; i++) {
var typeName = blob.ReadSerializedString();
string[] nameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None);
if (nameParts.Length < 2 || nameParts[1] == currentAssemblyName) {
output.Write("class ");
output.Write(DisassemblerHelpers.Escape(typeName + ", " + currentFullAssemblyName));
} else {
output.Write('[');
output.Write(nameParts[1]);
output.Write(']');
output.Write(nameParts[0]);
}
output.Write(" = {");
blob.ReadCompressedInteger(); // ?
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead.
int argCount = blob.ReadCompressedInteger();
if (argCount > 0) {
output.WriteLine();
output.Indent();
for (int j = 0; j < argCount; j++) { string currentAssemblyName = null;
WriteSecurityDeclarationArgument(module, ref blob); string currentFullAssemblyName = null;
output.WriteLine(); if (metadata.IsAssembly) {
} currentAssemblyName = metadata.GetString(metadata.GetAssemblyDefinition().Name);
currentFullAssemblyName = metadata.GetFullAssemblyName();
}
int count = blob.ReadCompressedInteger();
for (int i = 0; i < count; i++) {
var typeName = blob.ReadSerializedString();
string[] nameParts = typeName.Split(new[] { ", " }, StringSplitOptions.None);
if (nameParts.Length < 2 || nameParts[1] == currentAssemblyName) {
output.Write("class ");
output.Write(DisassemblerHelpers.Escape(typeName + ", " + currentFullAssemblyName));
} else {
output.Write('[');
output.Write(nameParts[1]);
output.Write(']');
output.Write(nameParts[0]);
}
output.Write(" = {");
blob.ReadCompressedInteger(); // ?
// The specification seems to be incorrect here, so I'm using the logic from Cecil instead.
int argCount = blob.ReadCompressedInteger();
if (argCount > 0) {
output.WriteLine();
output.Indent();
output.Unindent(); for (int j = 0; j < argCount; j++) {
WriteSecurityDeclarationArgument(module, ref blob);
output.WriteLine();
} }
output.Write('}');
if (i + 1 < count) output.Unindent();
output.Write(',');
output.WriteLine();
} }
output.Write('}');
if (i + 1 < count)
output.Write(',');
output.WriteLine();
} }
output.Unindent(); output.Unindent();
output.WriteLine("}"); output.WriteLine("}");
@ -428,12 +433,6 @@ namespace ICSharpCode.Decompiler.Disassembler
} }
} }
void WriteXmlSecurityDeclaration(string xml)
{
output.Write("property string XML = ");
output.Write("string('{0}')", DisassemblerHelpers.EscapeString(xml).Replace("'", "\'"));
}
enum TypeKind enum TypeKind
{ {
Primitive, Primitive,
@ -1373,6 +1372,11 @@ namespace ICSharpCode.Decompiler.Disassembler
void WriteBlob(BlobHandle blob, MetadataReader metadata) void WriteBlob(BlobHandle blob, MetadataReader metadata)
{ {
var reader = metadata.GetBlobReader(blob); var reader = metadata.GetBlobReader(blob);
WriteBlob(reader);
}
void WriteBlob(BlobReader reader)
{
output.Write("("); output.Write("(");
output.Indent(); output.Indent();

Loading…
Cancel
Save