2

我正在使用 Mono.Cecil 操作我的 .net 2.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 中,那我做错了什么?

4

1 回答 1

6

你猜对了。由于操作应用程序在 .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"));
于 2011-01-17T11:17:54.063 回答