Как установить «Копировать локальные зависимости» в проектах C # [проблема с CopyLocal] - PullRequest
4 голосов
/ 17 января 2011

У меня есть сборка с именем A.dll, в которой есть проект ссылка на сборку с именем B.dll. В сборке, на которую ссылается B.dll, есть двоичная ссылка на C.dll.

A.dll -> B.dll -> C.dll

Я установил в A.dll «Копировать локальный» для B в значение «истина», а в «B.dll» установил «Копировать локальный» в «false» для C.dll.

Во всяком случае, когда я собираю A.dll, я заканчиваю C.dll в папке результатов. Почему не учитывается значение «Копировать локальное» B.dll в C.dll?

Спасибо

Ответы [ 2 ]

4 голосов
/ 17 января 2011

Это потому, что msbuild смог найти c.dll. Он ничего не знает о копировании локальной настройки проекта B. Он просто просматривает директивы .assembly в метаданных b.dll и видит, что c.dll является зависимостью. И если он может найти c.dll, то он скопирует его. Если он не может найти его, то ничего не происходит, никаких жалоб тоже нет.

Нечетное и ваше решение заключается в том, что c.dll находится в том же каталоге, что и b.dll. Как оно туда попало? Просто остановите его копирование туда, и оно также не будет скопировано в каталог сборки A. В остальном, довольно мрачно, как вы ожидаете, что это когда-нибудь произойдет.

3 голосов
/ 17 января 2011

Это потому, что CopyLocal копирует указанную сборку и ее зависимости в выходную папку, , за исключением случаев, когда указанная сборка или зависимость находится в GAC .

Поскольку вы установили CopyLocal для ссылочной B, и B, и его зависимость C будут скопированы в выходную папку A, даже если вы не установили CopyLocal для ссылочной C в проекте B.

Обратите внимание: если вы создаете B, C это , а не , скопированный в выходную папку B.

Если вы хотите, чтобы B было скопировано в выходную папку A, но не хотите, чтобы то же самое произошло с C, одним из решений было бы поместить C в GAC.

...