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

#c# #winforms #serialization #code-generation #designer

Вопрос:

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

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

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


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

Комментарии:

1. Я бы тоже хотел знать ответ, но боюсь, что его нет.

2. Я тоже действительно ищу решение этой проблемы. Я хотел бы легко объединить новые функции с существующим кодом, предпочтительно путем анализа файла кода, а затем добавления новых элементов, после чего я создал бы скрипт из объединенного кодового модуля.

Ответ №1:

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

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

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

Комментарии:

1. Я надеялся избежать необходимости прилагать эти усилия. Проблема во времени — эта функция, хотя и необходима, недостаточно важна, чтобы оправдать затраты времени на написание синтаксического анализатора языка. Хотя я все еще обдумываю это.

2. В общем, кодировка VS довольно неполная. Он не успевал за изменениями языков со времен V7. Я думаю, что ради вашего продукта вам, вероятно, следует написать свой собственный парсер. Только так вы будете уверены, что сможете реагировать на будущие изменения языка.

Ответ №2:

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

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

Комментарии:

1. Да, мы уже делаем это, чтобы извлечь источник с поверхности, но мы хотим поместить источник обратно на поверхность, что и вызывает проблему.