Как встроиться в MSBuild и csc?
От: ZagSer168 Ниоткуда https://x.u168.ru
Дата: 02.01.14 07:04
Оценка:
Есть такая задача:
В C# проект добавлены спец. файлы, в которых описываются типы. Нужно по этим файлам генерировать C# код и включать этот код в результирующую сборку проекта.
Пример исходного файла с описанием типа (псевдокод):
type Circle
{
    // Auto Properties
    int CenterX { get; set; }
    int CenterY { get; set; }
    // Some method
    void Refresh() { ... } 
}

Для типа Circle надо сгенерить интерфейс и класс (C#, реализация пропущена):
public interface ICircle
{
    int CenterX { get; set; }
    int CenterY { get; set; }
    void Refresh();
}
public class Circle : ICircle
{
    int CenterX { get { ... } set { ... } }
    int CenterY { get { ... } set { ... } }
    void Refresh() { ... } 
}

Смысл генерации класса в особой реализации авто-свойств (CenterX, CenterY в примере).
Вопрос в том, как встроиться MSBuild.
Сложность ещё в зависимостях: C# код в проекте может использовать автоматически сгенерированные классы и интерфейсы (Circle, ICircle).
И с другой стороны для правильной генерации тел свойств класса (Circle) требуется знать типы в *.cs коде проекта.
Чтобы справиться с этими зависимостями можно использовать двухпроходную компиляцию:

  1. классы и интерфейсы (Circle, ICircle) генерятся с пустыми реализациями тел свойств и методов.
  2. полученный C# код вместе с обычными .cs файлами проекта компилируется во временную сборку.
  3. используя эту временную сборку, генерируются классы и интерфейсы (Circle, ICircle) с корректными реализациями
  4. компилируется результирующая сборка проекта

Аналогичная техника используется при генерации классов по XAML файлам.

Как я понимаю, для решения задачи надо написать модуль, который будет использоваться в MSBuild.
Что почитать про MSBuild? Только МСДН или ещё есть какая-то документация?
Как реализовать двухпроходную компиляцию? Похоже придётся подробно разбираться с методом компиляции XAML. Но может существуют примеры, где аналогичная задача уже решалась?
Одиночное наследование — это всего лишь частный случай множественного наследования.
msbuild
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.