C# 使用Mono.Cecil注入GeneratedCodeAttribute

C# 使用Mono.Cecil注入GeneratedCodeAttribute,c#,mono,mono.cecil,C#,Mono,Mono.cecil,我正在用Mono.Cecil操作.NET2.0程序集。 在操作之后,我想通过注入模块属性将程序集标记为已处理 var stringType = _module.Import(typeof(string)); var baseCtor = _module.Import(typeof(GeneratedCodeAttribute).GetConstructor(new[] { typeof(string), typeof(string) })); var result = new CustomAtt

我正在用Mono.Cecil操作.NET2.0程序集。 在操作之后,我想通过注入模块属性将程序集标记为已处理

var stringType = _module.Import(typeof(string));
var baseCtor = _module.Import(typeof(GeneratedCodeAttribute).GetConstructor(new[] { typeof(string), typeof(string) }));
var result = new CustomAttribute(baseCtor);
result.ConstructorArguments.Add(new CustomAttributeArgument(stringType, "ProcessedBySomething"));
result.ConstructorArguments.Add(new CustomAttributeArgument(stringType, "1.0"));
保存程序集后,它将依赖于.net 4.0,因为操作应用程序是在.net 4.0中编写的。
GeneratedCodeAttribute存在于.net 2.0中,那么我做错了什么?

您猜对了。由于操作应用程序在.net 4.0上运行,typeof是一个运行时功能,因此它将返回当前运行时版本的类型

要解决这个问题,最简单的方法是为正在修改的模块引用的mscorlib版本创建引用,使用Cecil打开程序集。您的代码将变成:

var stringType = _module.TypeSystem.String;
var corlib = (AssemblyNameReference) _module.TypeSystem.Corlib;
var system = _module.AssemblyResolver.Resolve (new AssemblyNameReference ("System", corlib.Version) {
    PublicKeyToken = corlib.PublicKeyToken,
});
var generatedCodeAttribute = system.MainModule.GetType ("System.CodeDom.Compiler.GeneratedCodeAttribute");
var generatedCodeCtor = generatedCodeAttribute.Methods.First (m => m.IsConstructor && m.Parameters.Count == 2);

var result = new CustomAttribute (_module.Import (generatedCodeCtor));
result.ConstructorArguments.Add(new CustomAttributeArgument(stringType, "ProcessedBySomething"));
result.ConstructorArguments.Add(new CustomAttributeArgument(stringType, "1.0"));

您在C#4.0代码中使用了
typeof(GeneratedCodeAttribute)
,这将为您提供与4.0运行时相关的类型。通过从2.0运行时加载
GeneratedCodeAttribute
,对Mono.Cecil没有同样的方法吗?谢谢,但不幸的是,它仍然链接到.net 4.0:(_module.AssemblyResolver.Resolve(“System,Version=“+_module.TypeSystem.Corlib.Version”);仍然返回System V4.0.0.0,当然,不管_module.TypeSystem.Corlib.Version是“2.0.0.0”。我编辑并修复了代码以正确解析系统。