Существует ли способ превратить исходный код обратно в CodeCompileUnit?

Мы используем DesignSurface и все это хорошее IDesignerHost в нашем собственном дизайнере. Затем разработанные формы сохраняются в нашем собственном формате, и все это прекрасно работает. МЫ также хотим экспортировать формы в текстовый формат (что мы и сделали, так как это не так сложно).

Однако мы также хотим импортировать этот текст обратно в документ для дизайнера, что предполагает возвращение кода дизайнера в CodeCompileUnit. К сожалению, метод Parse не реализован (без сомнения, по уважительным причинам). Есть ли альтернатива? Мы не хотим использовать ничего, чего не было бы в стандартной установке .NET (например, библиотеки .NET, устанавливаемые вместе с Visual Studio).

Моя текущая идея состоит в том, чтобы скомпилировать импортированный текст, а затем создать экземпляр формы, скопировать ее свойства и элементы управления в объект области разработки и просто захватить новый CodeCompileUnit, но я надеялся, что есть лучший способ. Спасибо.


ОБНОВЛЕНИЕ: я думаю, что некоторые могут быть заинтересованы в нашем прогрессе. Пока что не так хорошо. Краткий обзор того, что я обнаружил, заключается в том, что метод Parse не был реализован, потому что он был сочтен слишком сложным, существуют синтаксические анализаторы с открытым исходным кодом, которые выполняют эту работу, но они не являются полными и, следовательно, не гарантируют работу во всех случаях ( Я полагаю, NRefactory — один из проектов SharpDevelop), и копирование элементов управления из экземпляра в конструктор пока не работает. Я полагаю, что это связано с тем, что, хотя элементы управления добавляются к экземпляру формы, который обертывает поверхность дизайнера, поверхность дизайнера не знает об их включении. Наша следующая попытка — имитировать вырезание/вставку, чтобы посмотреть, решит ли это проблему. Очевидно, что это огромный неприятный обходной путь, но нам нужно, чтобы он работал, поэтому мы примем удар и будем следить за альтернативами.


person Jeff Yates    schedule 30.09.2008    source источник
comment
Я бы тоже хотел знать ответ, но боюсь, что его нет.   -  person ZeroBugBounce    schedule 06.10.2008
comment
Я действительно ищу решение этого тоже. Я хотел бы легко объединить новые функции с существующим кодом, предпочтительно путем анализа файла кода, а затем добавления новых членов, после чего я бы создал сценарий из объединенного CodeCompileUnit.   -  person Statement    schedule 12.02.2010


Ответы (2)


Вы всегда можете написать свой собственный синтаксический анализатор C#. Таким образом, вы можете быть уверены в его полноте.

В вашем случае, поскольку вам не нужно ничего вроде intellisense, вы, вероятно, могли бы просто использовать генератор парсеров.

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

person Scott Wisniewski    schedule 30.01.2009
comment
Я надеялся избежать необходимости делать это усилие. Проблема во времени — эта функция, хотя и необходимая, не настолько важна, чтобы оправдать затраты времени на написание синтаксического анализатора языка. Я все еще обдумываю это. - person Jeff Yates; 31.01.2009
comment
В общем, VS CodeDom довольно неполный. Он не поспевает за изменениями языков, начиная с V7. Я думаю, ради вашего продукта вам, наверное, стоит написать свой парсер. Только так вы будете уверены, что сможете реагировать на будущие языковые изменения. - person Scott Wisniewski; 01.02.2009

Это не совсем то, о чем вы просили, но вы можете попробовать использовать класс CodeDomComponentSerializationService для создания графа CodeDom на основе текущего состояния области проектирования.

Мы используем этот класс для обработки функций копирования/вставки в нашем встроенном дизайнере.

person Jason Diller    schedule 11.10.2008
comment
Да, мы уже делаем это, чтобы вывести источник с поверхности, но мы хотим поместить источник обратно на поверхность, что вызывает проблему. - person Jeff Yates; 21.10.2008