Начиная с версии 3.0,.NET устанавливает множество различных "сборочных сборок" в разделе C:\Program Files\Reference Assemblies\Microsoft.... для поддержки разных профилей (например, профиль клиента .NET 3.5, профиль Silverlight). Каждая из них является подходящей сборкой .NET, которая содержит только метаданные - не IL-код, и каждая сборка помечена ReferenceAssemblyAttribute
. Метаданные ограничены теми типами и членами, доступными в соответствии с применимым профилем, - что как intellisense показывает ограниченный набор типов и членов. Ссылочные сборки не используются во время выполнения.
Я немного узнал об этом из этого сообщения в блоге.
Я хотел бы создать и использовать такую ссылочную сборку для своей библиотеки.
- Как создать сборку только для метаданных - есть ли какой-нибудь флаг компилятора или постпроцессор ildasm?
- Существуют ли атрибуты, которые управляют тем, какие типы экспортируются в разные "профили"?
- Каким образом разрешение ссылочной сборки во время выполнения - если бы у меня была ссылочная сборка, присутствующая в моей директории приложений, а не в "реальной" сборке, а не в GAC вообще, прощупывание продолжалось бы и событие AssemblyResolve, чтобы я может поставлять фактическую сборку во время выполнения?
Любые идеи или указатели на то, где я мог бы узнать больше об этом, будут очень признательны.
Обновление. Оглядываясь немного, я вижу, что сборщики ссылок .NET 3.0, похоже, имеют некоторый код, а атрибут Reference Assembly был добавлен только в .NET 4.0. Таким образом, поведение может немного измениться с новой средой выполнения.
Почему? Для моей библиотеки Excel-DNA (http://exceldna.codeplex.com) я создаю однодоменную надстройку .xll, упаковывая ссылочные сборки в файл .xll как Ресурсы. Упакованные сборки включают пользовательский код надстройки, а также управляемую библиотеку Excel-DNA (на которую может ссылаться сборка пользователя).
Это звучит довольно сложно, но в большинстве случаев он прекрасно работает - надстройка представляет собой один небольшой файл, поэтому нет установки проблем с дистрибутивом. Я сталкиваюсь с (не неожиданными) проблемами из-за разных версий - если в качестве файла старой управляемой библиотеки Excel-DNA есть старая версия, среда выполнения загрузит это вместо упакованного (я никогда не получаю возможность помешать загрузка).
Я надеюсь создать ссылочную сборку для моей управляемой Excel-ДНК части, которую пользователи могут указать при компиляции своих надстроек. Но если они ошибочно имеют версию этой сборки во время выполнения, среда выполнения должна не загружать ее и дать мне возможность загрузить реальную сборку из ресурсов.