5

我正在使用 Mono.Cecil 0.9.5.3,在安装 VS2012 RC(导致 .NET 4.0 System.XML.DLL 被其 .NET 4.5 对应物替换)之后,我在一些迭代的代码中得到了 System.ArugmentException每个方法的自定义属性。原因似乎是在某些情况下,AsyncStateMachine属性的 ctor 参数(应该是 Type)为空。

以下代码重现了它:

string path = Assembly.Load("System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089").Location;

AssemblyDefinition systemXmlAssembly = AssemblyDefinition.ReadAssembly(path);

var query =

    from ModuleDefinition module in systemXmlAssembly.Modules
    from TypeDefinition td in module.Types
    from MethodDefinition method in td.Methods
    from CustomAttribute att in method.CustomAttributes
    where method.Name == "System.Xml.IDtdParser.ParseInternalDtdAsync" &&
            att.AttributeType.Name == "AsyncStateMachineAttribute"
    select att;

CustomAttribute attribute = query.Single();

var args = attribute.ConstructorArguments; // <---- this line throws an ArgumentException

异常是从

Mono.Cecil.ModuleDefinition.CheckFullName(string fullName = "")

我的问题是 - 这是 Mono.Cecil 还是 System.Xml.DLL 中的错误?规范是否允许“空”类型作为 ctor 参数出现?

4

1 回答 1

10

对我来说,这看起来像是 Cecil 中的一个错误,从某种意义上说,Cecil 应该阅读它而不会崩溃。

您可以在https://github.com/jbevain/cecil提交错误并在某处上传 4.5 System.XML.dll 吗?然后我会看看,并报告它是实际的 Cecil 问题,还是 System.XML 中错误编码的自定义属性。

更新

这确实是塞西尔的问题。它现在已在 master 中修复。在发布新的 nuget 包之前,您必须自己构建 Cecil。谢谢!

于 2012-06-10T14:15:34.180 回答