Порядок разрешения сборки во время компиляции - PullRequest
3 голосов
/ 25 августа 2009

Как VS 2008 определяет, где искать сборки, используемые при компиляции приложений? Должен быть использован какой-то порядок. Есть ли что-то, что используется в Tools \ Settings или что-то еще? Я ищу порядок разрешения сборок, который происходит в процессе компиляции.

Ответы [ 3 ]

2 голосов
/ 25 августа 2009

В действительности порядок определяется не VS 2008, а компилятором. Я знаю, что вы не указали язык, но я буду использовать C # в качестве примера (я уверен, что многие другие языки также послужат хорошим примером). Если вы использовали C #, то компилятор сначала обрабатывает csc.rsp (файл ответов, расположенный рядом с csc.exe), а затем параметры командной строки / r :. Порядок операций определяет, на какую сборку ссылаются. Поэтому сначала нужно найти ссылки на сборки в csc.rsp, а затем найти сборки командной строки. Это было время компиляции.

Вот документы для файла ответов C #:

http://msdn.microsoft.com/en-us/library/8a1fs1tb(VS.71).aspx

Вот документы для параметров компилятора командной строки C #:

http://msdn.microsoft.com/en-us/library/2fdbz5xd(VS.71).aspx

Вам придется использовать компилятор командной строки, если вы хотите использовать пользовательский файл ответов. В противном случае ссылки, которые вы добавляете в папку ссылок проекта, определяют, что будет отображаться в командной строке при сборке в VS. Вы можете увидеть порядок, в котором эти ссылки появляются в командной строке, выполнив сборку и посмотрев в окно вывода, Ctrl + W + O.

Привязка сборки во время выполнения не определяется ни VS, но, скорее, CLR. Быстрое суммирование заключается в том, что CLR ищет, загружала ли сборка ранее в память, проверяет GAC, а затем выполняет зондирование, основываясь на том, был ли явный вызов Load в коде, а затем на настройках файла конфигурации для codeBase, а затем набор папок в папке приложения, которые названы для версий сборок exe или dll. Вот ссылка MSDN:

http://msdn.microsoft.com/en-us/library/yx7xezcf.aspx

Тот факт, что вы задаете этот вопрос, заставляет меня задуматься, не является ли ваша мотивация решением проблемы привязки сборки. В пакете .NET Framework SDK имеется инструмент, который называется Просмотр журнала привязки сборки (Fuslogvw.exe), помогающий решить следующие проблемы:

http://msdn.microsoft.com/en-us/library/e74a18c4(VS.71).aspx

Пару лучших ресурсов в сети для работы с привязками сборок и программой просмотра журнала Fusion - Fusion Workshop Ричарда Граймса:

http://www.grimes.demon.co.uk/workshops/fusionWS.htm

Несколько лет назад Сюзанна Кук, которая была членом команды CLR, сделала отличную серию публикаций по связыванию CLR:

http://blogs.msdn.com/suzcook/default.aspx

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

Джо

1 голос
/ 25 августа 2009

Вот сообщение, которое, похоже, может пролить свет на ваш вопрос ... Извините, у меня не было времени, чтобы получить лучший ответ.

http://blogs.msdn.com/saraford/archive/2008/10/13/did-you-know-how-to-change-the-build-order-for-your-solution-333.aspx

0 голосов
/ 25 августа 2009

Уверен, это зависит от того, как вы добавили свои ссылки.

Я думаю это выглядит так:

  1. Если ссылка GAC, посмотрите в GAC
  2. Если ссылка на проект, из результатов сборки проекта
  3. Если ссылка на файл, посмотреть местоположение файла

Если у вас есть прямая ссылка на некоторый тип, то ваш проект не будет собран, если вы не ссылаетесь на содержащую его сборку, поэтому вы не можете просто поместить файлы в общий каталог и скомпилировать. Вы должны явно ссылаться на сборку.

Разрешение сборки больше беспокоит во время выполнения. Во время компиляции это довольно детерминировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...