Могу ли я использовать Reflection.Emit для генерации кода и сохранять сгенерированные коды в файлах .cs или я могу использовать CodeDom? - PullRequest
1 голос
/ 28 июня 2011

Я хочу написать генератор кодов и сохранить эти коды с помощью шаблона mvp. Могу ли я использовать Reflection.Emit в качестве решения или CodeDom лучше?

EDIT --------------

Мне нужно выполнить 2 работы, во-первых, я хочу скомпилировать этот код во время выполнения и запустить его, а во-вторых, сгенерировать исходный код как вариант.

Ответы [ 2 ]

2 голосов
/ 28 июня 2011

Хотя вы можете решить некоторые аспекты вашего вопроса с помощью обоих пространств имен ( System.CodeDom и System.Reflection.Emit ), вы не можете смешать два разных понятия и использоватьвариант (ы), который лучше всего подходит для того, что вы хотите сделать.

Если вы просто хотите сгенерировать и скомпилировать код C # \ VB, возможно, вы захотите использовать System.CodeDom :

Это пространство имен можно использовать для моделирования структуры документа с исходным кодом, который можно выводить в виде исходного кода на поддерживаемом языке, используя функциональные возможности, предоставляемые System.CodeDom.Compiler. namespace.

Посмотрите на этот небольшой пример того, как определить метод с помощью CodeDom:

// Defines a method that returns a string passed to it.
CodeMemberMethod method1 = new CodeMemberMethod();            
method1.Name = "ReturnString";
method1.ReturnType = new CodeTypeReference("System.String");
method1.Parameters.Add( new CodeParameterDeclarationExpression("System.String", "text") );
method1.Statements.Add( new CodeMethodReturnStatement( new CodeArgumentReferenceExpression("text") ) );            

// A C# code generator produces the following source code for the preceeding example code:

//    private string ReturnString(string text) 
//    {
//        return text;
//    }

Что касается системы.Reflection.Emit используется для создания и манипулирования MSIL (Microsoft Intermediate Language), который является низкоуровневым читаемым человеком языком программирования, определяемым спецификацией Common Language Infrastructure и используемым .NET Framework.Обратите внимание, что MSIL теперь известен как CIL (Common Intermediate Language):

Пространство имен System.Reflection.Emit содержит классы, которые позволяют компилятору или инструменту генерировать метаданные и промежуточный язык Microsoft (MSIL) и при необходимостисоздать PE-файл на диске.Основными клиентами этих классов являются скриптовые движки и компиляторы.

Использование этого подхода приводит к изучению инструкций байт-кода CIL, что является довольно сложной и сложной задачей, даже если вы знакомы с ассемблерным кодом.и может быть не идеальным, если то, что вы хотите, достаточно просто и быстро реализуется.Посмотрите статью из Википедии в списке CIL и CIL для первого впечатления.

1 голос
/ 28 июня 2011

Если вы хотите, чтобы опция видела исходный код C #, я скажу пойти с CodeDom.Reflection.Emit отображает IL, но получить его в пригодный для использования код C # будет непросто.

...