3 回答
TA贡献2041条经验 获得超4个赞
不清楚你真正想做什么(XY 问题?)
尽管如此,如果你想修改一个程序集,你通常使用Mono.Cecil,它自我描述为:你可以加载现有的托管程序集,浏览所有包含的类型,动态修改它们并将修改后的程序集保存回磁盘。.
请注意,属性可以包含作为参数传递的数据之上的额外数据:
public class MyAttribute : Attribute
{
public MyAttribute(string str)
{
argument = str;
}
private string argument;
public string Argument { get; }
public string AssemblyName
{
get
{
return Assembly.GetEntryAssembly().FullName;
}
}
}
[MyAttribute("Hello")]
class Program
{
static void Main(string[] args)
{
var attr = typeof(Program).GetCustomAttribute<MyAttribute>();
Console.WriteLine(attr.Argument);
Console.WriteLine(attr.AssemblyName);
}
}
TA贡献1803条经验 获得超6个赞
使用来自@xanatos 的非常有用的建议,我提出了这个解决方案:
在 .NET 2 下,您可以安装包 Mono.Cecil 0.9.6.1。
代码如下:
AssemblyDefinition assbDef = AssemblyDefinition.ReadAssembly("x.dll");
TypeDefinition type = assbDef.MainModule.GetType("NameSpace.MyClass").Resolve();
foreach (CustomAttribute attr in type.CustomAttributes)
{
TypeReference argTypeRef = null;
int? index = null;
for (int i = 0; i < attr.ConstructorArguments.Count; i++)
{
CustomAttributeArgument arg = attr.ConstructorArguments[i];
string stringValue = arg.Value as string;
if (stringValue == "Name")
{
argTypeRef = arg.Type;
index = i;
}
}
if (index != null)
{
attr.ConstructorArguments[(int)index] = new CustomAttributeArgument(argTypeRef, newName);
}
}
assbDef.Write("y.dll");
这将在程序集中搜索任何具有 value 的属性参数"Name"并将它们的值替换为newName.
- 3 回答
- 0 关注
- 186 浏览
添加回答
举报