我需要.Net Reflection.Emit
的帮助。
需要在其中创建包含Assembly
和public struct
字段的简单string
。字段必须是常量,我还需要定义它。总之,我需要得到Assembly
这样的东西:
namespace n {
struct Alpha {
public const string DATA = "Alpha";
}
}
我不明白如何创建string
字段以及如何定义它。
此刻我正在写这段代码:
private static void Generate()
{
var an = new AssemblyName("Beta") { Version = new Version("1.0.0.0") };
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);
var mb = ab.DefineDynamicModule("BetaModule", "Beta.dll");
var tb = mb.DefineType("n.Beta", TypeAttributes.Public, typeof(System.ValueType));
// What I need do after it? How I understand from MSDN I need call DefineInitializedData method but i am not shure how do it.
tb.CreateType();
ab.Save("Beta.dll");
}
解决方案:
private static void Generate() {
var an = new AssemblyName("Beta") { Version = new Version("1.0.0.0") };
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);
var mb = ab.DefineDynamicModule("BetaModule", "Beta.dll");
var tb = mb.DefineType("n.Beta", TypeAttributes.Public, typeof(System.ValueType));
var fb = tb.DefineField("DATA", typeof(string), FieldAttributes.Public | FieldAttributes.Literal);
fb.SetConstant("Beta");
tb.CreateType();
ab.Save("Beta.dll");
}
我不确定它是100%正确,但它确实有效。顺便说一句,如果有人会检查它会很棒。也许我犯了一些错误......
答案 0 :(得分:2)
常数对IL没有意义。它们由编译器编译,它将它们的字面值发送到IL中。当您使用Reflect.Emit时,您正在扮演编译器的角色,您自己发出了值。
这不是一个真正的问题,你可以在你自己的代码中声明const。每当需要使用const时,都会发出ldc或ldstr操作码。