Мне нужна помощь. Net Reflection.Emit
.
Необходимо создать простую сборку
с публичной структурой
и полем строки
в ней. Поле должно быть постоянным, и мне также нужно его определить. В общем, мне нужно получить 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% правильно, но это работает. Кстати, было бы здорово, если бы кто-нибудь это проверил. Может быть, я допустил некоторые ошибки ...
Константы не имеют значения в IL. Они компилируются компилятором, он передает их буквальное значение в IL. Вы играете роль компилятора, когда используете Reflect.Emit, вы сами испускаете значение.
Это не проблема, вы можете просто объявить константу в своем собственном коде. И выдавать код операции ldc или ldstr всякий раз, когда необходимо использовать константу.