Нужны ли переадресации привязки в app.config для библиотек классов?

Решения VS, с которыми я часто работаю, состоят из одного исполняемого проекта (консольного приложения, веб-приложения) и множества проектов библиотеки классов, на которые ссылается исполняемый файл.

При работе с NuGet и установке пакетов для каждого проекта часто создается файл app.config, обычно не содержащий ничего, кроме списка перенаправлений привязки, объединяющих версии ссылочных сборок. Иногда есть какой-то сторонний контент, специфичный для библиотеки (например, раздел конфигурации Entity Framework), но пока оставим это в стороне.

Когда я собираю решение и использую двоичные файлы основного исполняемого проекта, я вижу все сборки проекта библиотеки классов в выводе сборки вместе с соответствующими файлами *.config (файл app.config переименовывается в AssemblyName.config при AssemblyName.config),

При запуске основного исполняемого файла влияют ли какие-либо файлы конфигурации сборок библиотеки классов? Или это просто файл app.config исполняемого файла, который имеет эффект в этом случае? Что если в некоторых проектах библиотек классов установлены некоторые перенаправления привязки, а в основном исполняемом проекте - несколько разных перенаправлений привязки - как они объединяются, которые имеют приоритет?

Я пытался исследовать это онлайн, и из того, что я прочитал, мне кажется, что файлы app.config для неисполняемых сборок бесполезны (в отношении связывания перенаправлений). Может кто-то подтвердить это или уточнить немного по теме?

Если это так, то действительно ли нежелательно, чтобы эти файлы app.config создавались NuGet в библиотеках классов, если они содержат только перенаправления привязки? Мне кажется, что NuGet не должен создавать эти перенаправления привязки для проектов библиотеки классов, поскольку это только увеличит путаницу в отношении того, какие параметры фактически применяются.


Я нашел эти существующие вопросы по этой теме, но их принятые ответы на самом деле противоречивы, даже если они помечены как дубликаты друг друга.

В принятом ответе на первый вопрос упоминается, что файлы app.config фактически используются во время компиляции, что означает, что они могут иметь эффект. Источники, такие как исходный код MSDN и MSBuild, приводятся там в качестве доказательства того, что он использовался во время компиляции. К сожалению, я не достаточно опытен в MSBuild, чтобы понять, как он используется, и действительно ли это правильный аргумент.

Кто-нибудь может описать пример сценария, чтобы доказать, что app.config с перенаправлением привязки для библиотеки классов может делать все что угодно?

Ответ 1

У меня есть несколько приложений с аналогичной настройкой - веб-приложение, ссылающееся на несколько проектов библиотек, каждый из которых имеет свои собственные пакеты nuget и т.д. На основании моего личного опыта привязки сборки в библиотечных проектах не рассматриваются во время выполнения.

Связывание, указанное в настройках веб-приложения или приложения в корневом приложении (веб-консоль), является только вопросом. Все мои проекты библиотеки настраиваются с параметром "Копировать в выходной каталог" как "Не копировать" для файла app.config. Таким образом, моя папка вывода не захламлена dll и их конфигурационными файлами.

Вот ссылка, в которой говорится, как загружается сборка и где она выполняется, и ее последовательность. Нет, где в статье они рассказывают об отдельных конфигурационных файлах проекта.

Надеюсь, это поможет.

Ответ 2

Согласно этой старой статье msdn:

Файл конфигурации приложения представляет собой XML файл, используемый для управления привязкой к сборке. Он может перенаправить приложение из одной версии бок о бок сборки в другую версию той же сборки. Это называется конфигурацией для каждого приложения. Файл конфигурации приложения применяется только к конкретному манифесту приложения и зависимым сборкам. Изолированные компоненты, скомпилированные с помощью встроенного манифеста [ ISOLATIONAWARE_MANIFEST_RESOURCE_ID ], требуют отдельного файла конфигурации приложения. Манифесты, созданные с помощью CreateActCtx, требуют отдельного файла конфигурации приложения.

Таким образом, только dll с набором ISOLATIONAWARE_MANIFEST_RESOURCE_ID фактически использует независимую конфигурацию приложения, в противном случае она откладывается до основного файла конфигурации процесса.

Для получения дополнительной информации о том, что такое ISOLATIONAWARE, вы можете прочитать эту другую статью MSDN, которая идет более подробно.

ISOLATIONAWARE_MANIFEST_RESOURCE_ID используется в основном для библиотек DLL. Он должен использоваться, если dll хочет, чтобы частные зависимости отличались от процесса по умолчанию. Например, если dll зависит от comctl32.dll версии 6.0.0.0. Он должен иметь ресурс типа RT_MANIFEST, ID ISOLATIONAWARE_MANIFEST_RESOURCE_ID, чтобы зависеть от comctl32.dll версии 6.0.0.0, так что даже если исполняемый файл процесса хочет версию comctl32.dll 5.1, сама dll по-прежнему будет использовать правильную версию comctl32.dll.

Ответ 3

Как правило, есть только один файл конфигурации, и это файл конфигурации исполняемого файла (.exe.config, web.config).

Любые перенаправления сборки должны быть помещены в файл конфигурации исполняемого файла.

Конфигурационные файлы DLL необходимо загружать вручную, используя класс ConfigurationManager. См. Также этот вопрос. Эквивалент "app.config" для библиотеки (DLL)

Ответ 4

Нет, только эффект app.config исполняемого файла будет иметь эффект. Например, если у вас есть консольное приложение, на котором размещена служба WCF, а в вашей службе WCF вы используете, например, ConfigurationManager.AppSettings, AppSettings будет поступать из файла app.config хоста консоли. Если вы развернете другое консольное приложение (ConsoleClient), чтобы попытаться подключиться к ConsoleHost, то в тех частях, где ConsoleClient можно назвать "исполнением" (например, в его основном методе), он будет использовать ConsoleClient app.config, но как только он начнет использовать службу WCF, служба WCF будет делегировать использование ConsoleHost app.config. (Обратите внимание, что этот последний пункт более важен для деталей, стоящих за WCF.)

Удивительно, но msdn предоставил этот отличный источник: https://social.msdn.microsoft.com/Forums/vstudio/en-US/e13194df-6308-4cbe-973c-f6a462f43eae/how-can-wcf-library-dll-access- приложения-настройка реферер = HTTP://social.msdn.microsoft.com/Forums/vstudio/en-US/e13194df-6308-4cbe-973c-f6a462f43eae/how-can-wcf-library-dll-access-application- настройки реферер = HTTP://social.msdn.microsoft.com/Forums/vstudio/en-US/e13194df-6308-4cbe-973c-f6a462f43eae/how-can-wcf-library-dll-access-application-settings? форум = ФОС

Ответ 5

Ответ может быть. В зависимости от типа проекта файл библиотеки. Некоторые библиотечные проекты выполняются в тех случаях, когда уважается файл конфигурации библиотеки (например, веб-роли Azure), но это не является нормой.

Смотрите мой ответ здесь для более подробной информации.