Динамическое создание сборки, предназначенной для определенной среды выполнения .NET, с использованием Reflection.Emit

Я использую Reflection.Emit для разработки инструмента, который динамически создает сборку во время выполнения.

Инструмент предназначен для платформы .NET 4.5.

Я хотел бы узнать, можно ли указать, какой .NET runtime будут динамически создаваться цели сборки (например, указать, что сборка .NET 3.5 будет создана, например).

Ответ 1

Встроенный рефлекс-излучение здесь довольно ограничен; то, что вы хотите сделать, это сказать, что он использует определенную сборку mscorlib, но проблема в том, что много отражения-излучения включает в себя передачу Type вокруг, что делает это невероятно трудным. Наиболее прагматичным способом, который я нашел для решения этой проблемы, было переход на IKVM.Reflection.dll - часть IKVM.NET. Эта dll имеет очень преднамеренно тот же базовый API, что и Reflection.Emit, но вместо того, чтобы работать с встроенными объектами Type, он работает против экземпляров IKVM, которые загружаются в концепцию Universe. A Universe может затем загрузить требуемую dll mscorlib и любые другие DLL, которые вам нужны.

Изменения для этого обычно просто изменяют операторы using. Этот подход используется во всем protobuf-net (в частности, прекомпиляционном инструменте), позволяя не только разные версии, но и целые различные структуры. Хотите создать dll, который нацелен на Silverlight из обычного приложения .NET? Не проблема. Самый сложный бит (IMO) просто находит правильный mscorlib и поддерживающие файлы для загрузки в Universe.

Смотрите мой блог Введите IKVM - или посмотрите примеры на IKVM, например Типы указателей функций.

Я могу предоставить дополнительную информацию по мере необходимости.