Есть такая задача:
В 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 коде проекта.
Чтобы справиться с этими зависимостями можно использовать двухпроходную компиляцию:
классы и интерфейсы (Circle, ICircle) генерятся с пустыми реализациями тел свойств и методов.
полученный C# код вместе с обычными .cs файлами проекта компилируется во временную сборку.
используя эту временную сборку, генерируются классы и интерфейсы (Circle, ICircle) с корректными реализациями
компилируется результирующая сборка проекта
Аналогичная техника используется при генерации классов по XAML файлам.
Как я понимаю, для решения задачи надо написать модуль, который будет использоваться в MSBuild.
Что почитать про MSBuild? Только МСДН или ещё есть какая-то документация?
Как реализовать двухпроходную компиляцию? Похоже придётся подробно разбираться с методом компиляции XAML. Но может существуют примеры, где аналогичная задача уже решалась?
Одиночное наследование — это всего лишь частный случай множественного наследования.