мне нужна помощь с .net Reflection.EmitКак инициализировать и определить константную строку с Reflection.Emit
Нужен создавать простые сборочный с общественной структурой и струнным полем в нем. Поле должно быть постоянным, и мне также нужно определить его. В целом мне нужно получить сборку, которая хранится внутри чего-то вроде этого:
namespace n {
struct Alpha {
public const string DATA = "Alpha";
}
}
Я не понимаю, как создать поле строки и как определить ее.
В данный момент я пишу этот код:
private static void Generate() {
var an = new AssemblyName("Beta") { Version = new Version("1.0.0.0") };
var ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save); // ToDo добавить путь к дирректории bin/debug проекта etalon
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% правильно, но его работа. Кстати, будет здорово, если кто-нибудь это проверит. Может, я ошибаюсь?
, пожалуйста, найдите время, чтобы прочитать [FAQ] (http://stackoverflow.com/faq). Вы увидите, что это сайт Q & A, а не дискуссионный форум. Одним из результатов этого является то, что мы не используем подписи, линии тегов, «привет» или «спасибо». –