Используйте CodeDom для конвертации одного языка в другой? - PullRequest
1 голос
/ 25 мая 2011

Вы можете запустить мой источник в качестве примера http://www.pastie.org/1969780

Я, по сути, взял это и поиграл с этим http://msdn.microsoft.com/en-us/library/ms404245.aspx

Если я создаю кодировку, как показано в ссылке msdn, я могу генерировать коды cs и vb. Однако, если я читаю код cs или vb и пытаюсь сгенерировать исходный код на другом языке, я просто получаю любой код, из которого я первоначально читал (вы увидите код cs в файле vb и наоборот).

Как мне прочитать в источнике с одного языка и сгенерировать его на другом?

1 Ответ

2 голосов
/ 25 мая 2011

Выполнение, как вы показали в вашем примере, не работает, потому что вы используете CodeSnippetCompileUnit. По сути, это просто содержит один элемент, Value, который содержит ваш оригинальный код дословно.

Теперь, CodeDomProvider / CodeDomGenerator не настолько умен, он не будет внутренне анализировать этот дословный исходный код в дерево CodeDom, которое затем выкладывается на нужный вам язык. Фактически, используя dotPeak или что-то еще, вы можете видеть, что в случае использования CodeSnippetCompileUnit он будет просто выводить исходное содержимое Value-Member.

Что вам нужно сделать, это вручную создать дерево CodeDom из прочитанного исходного кода, используя генератор кода на выбранном вами языке, и записать его в качестве исходного.

Честно говоря, я не знаю, обеспечивает ли инфраструктура для такой работы System.CodeDom (а именно анализатор для каждого исходного языка, который вам нужен, который выводит дерево CodeDom). Кроме того, я не знаю, действительно ли это лучший способ сделать это в любом случае. Другие подходы могут включать компиляцию исходного кода (по крайней мере, IL) и преобразование его обратно в целевой язык (во многом как декомпилятор) - конечно, при использовании этого подхода вы теряете (по крайней мере) комментарии из исходного источника.

...