Я хотел бы обойти некоторые классические методы сканирования сборки в рамках, которые я разрабатываю.
Итак, скажем, я определил следующий контракт:
public interface IModule
{
}
Это существует в выражении Contracts.dll
.
Теперь, если я хочу обнаружить все реализации этого интерфейса, мы, вероятно, сделаем что-то похожее на следующее:
public IEnumerable<IModule> DiscoverModules()
{
var contractType = typeof(IModule);
var assemblies = AppDomain.Current.GetAssemblies() // Bad but will do
var types = assemblies
.SelectMany(a => a.GetExportedTypes)
.Where(t => contractType.IsAssignableFrom(t))
.ToList();
return types.Select(t => Activator.CreateInstance(t));
}
Не отличный пример, но он будет делать.
Теперь эти методы сканирования сбоку могут быть довольно неполными, и все это выполняется во время выполнения, что обычно влияет на производительность запуска.
В новой среде DNX мы можем использовать экземпляры ICompileModule
в качестве инструментов метапрограммирования, чтобы вы могли объединить реализацию ICompileModule
в свою папку Compiler\Preprocess
в своем проекте и заставить ее делать что-то напуганное.
То, что моя цель будет, заключается в использовании реализации ICompileModule
для выполнения работы, которую мы будем делать во время выполнения, во время компиляции.
- В моих ссылках (как компиляциях, так и сборках) и моей текущей компиляции обнаружайте все incaniatable экземпляры
IModule
- Создайте класс, позвоните ему
ModuleList
с реализацией, которая дает экземпляры каждого модуля.
public static class ModuleList
{
public static IEnumerable<IModule>() GetModules()
{
yield return new Module1();
yield return new Module2();
}
}
Если этот класс добавлен в блок компиляции, мы можем вызвать его и получить статический список модулей во время выполнения, вместо того чтобы искать все прикрепленные сборки. Мы существенно разгружаем работу над компилятором вместо среды выполнения.
Учитывая, что мы можем получить доступ ко всем ссылкам для компиляции с помощью свойства References
, я не вижу, как я могу получить любую полезную информацию, например, возможно, доступ к байтовому коду, чтобы, возможно, загрузить сборку для отражение или что-то в этом роде.
Мысли?