【问题标题】:Injecting GeneratedCodeAttribute with Mono.Cecil使用 Mono.Cecil 注入 GeneratedCodeAttribute
【发布时间】:2011-01-17 20:05:32
【问题描述】:

我正在使用 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 中,我做错了什么?

【问题讨论】:

  • 您在 C# 4.0 代码中使用 typeof(GeneratedCodeAttribute),这将为您提供与 4.0 运行时相关的类型。难道没有办法通过从 2.0 运行时加载 GeneratedCodeAttribute 来使用 Mono.Cecil 做同样的事情吗?

标签: c# mono mono.cecil


【解决方案1】:

你猜对了。由于操作应用程序在 .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"));

【讨论】:

  • 谢谢,但不幸的是它仍然与 .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”
  • 当然。我编辑并修复了代码以正确解析 System.
猜你喜欢
  • 2017-04-12
  • 2012-09-27
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多