Сохранение типов, созданных с помощью Reflection.Emit, в виде файла кода (.cs) вместо сохранения его в файлах .dll - PullRequest
1 голос
/ 03 апреля 2010

Перед началом позвольте мне рассказать о своем опыте: у меня есть опыт работы с C # .NET, веб-службами, XML-частью и некоторыми другими.Отражение - это что-то новое для меня, хотя я много читал об этом и попробовал какой-то экспериментальный код, но ничего хорошего не сделал, используя отражение

.мы можем создать Type во время выполнения, а затем сохранить его в файле сборки (.dll).Из всех примеров, которые я видел, речь идет о сохранении созданных типов в файлах DLL вместо файла кода.Нет ли способа создать файл кода из отражения?

Мне нужно создать файл кода, поскольку я хочу распространять код вместо скомпилированных сборок.Я хочу сделать что-то вроде xsd.exe, выплевывая .dll или файл кода (на любом языке).

Нет ли способа создать файл кода, так как большинствоместо, которое я могу найти, это

AssemblyBuilder ab = System.AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Save);

и, наконец,

ab.Save("QuoteOfTheDay.dll");

Ответы [ 2 ]

4 голосов
/ 03 апреля 2010

В платформу .NET не встроен дизассемблер. Вы можете использовать Reflector для преобразования выданного вами IL в один из поддерживаемых им языков исходного кода. Маловероятно, что это будет работать без проблем, Reflector был разработан для преобразования кода, сгенерированного компилятором, в исходный код. Компиляторы, как правило, консервативны в отношении генерируемого им IL, в отличие от универсального подхода, предлагаемого System.Reflection.Emit.

Если вам нужен исходный код, то лучше всего его сгенерировать. Используйте System.CodeDom. Вот что использует System.Xml.Serialization.

2 голосов
/ 03 апреля 2010

Обычно для генерации источника C # используются либо строковые классы, либо CodeDOM (http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx).

...