Обеспечение независимости процесса сборки от GAC

Как мы можем сделать наш процесс сборки (Dev Studio 2005) для проекта .NET полностью независимым от того, что установлено в GAC на конкретной машине, на которой он работает.

Вот проблема, которую мы пытаемся решить: в зависимости от того, какие сборки были установлены в GAC, наш процесс сборки генерирует разные сборки .NET в выходном каталоге, которые мы затем используем для создания .MSI

Предположительно это связано с тем, что студия разработки предполагает, что, поскольку он установлен в GAC, его не следует устанавливать как часть нашего продукта.

Мы хотим отключить это поведение, чтобы все сборки .NET, на которые прямо или косвенно ссылается наш проект, копировались в выходной каталог проекта (за исключением стандартных сборок среды выполнения .NET 2.0).

Что касается прямых ссылок на сборки, я знаю, что установка «Copy Local = True» делает эту работу.

Однако это не работает для косвенных ссылок на сборку.

т.е. один из наших проектов ссылается на сборку с именем «A.dll», которая зависит от другой сборки с именем «B.dll», которая находится в том же каталоге, что и «A.dll». На машинах, на которых «B.dll» не установлен в GAC, A.dll и B.dll копируются в выходной каталог в процессе сборки Dev studio. Это то, что мы хотим.

Но на машинах, на которых B.dll установлен в GAC, даже если «Copy Local = True» для A.dll, B.dll не копируется в выходной каталог.


person Paul Hollingsworth    schedule 05.02.2009    source источник
comment
У меня противоположная проблема. В моем сборочном блоке ничего нет в gac, поэтому в моих веб-приложениях публикуется слишком много   -  person Ryu    schedule 23.04.2009


Ответы (3)


Как и предположил Марк, единственный способ сделать это - добавить зависимые ссылки и установить CopyLocal = True.

Но я соглашусь с ответом Дэнни - не используйте Dev Studio для развертывания, потому что вы не можете получить достаточный контроль над процессом сборки.

Почему? В Dev Studio действует некоторая логика «по умолчанию», в которой, если она вычислила значение свойства, то она не будет сохранять его в файл .CSPROJ, оставляя экземпляр Dev Studio на другом компьютере для выполнения задачи «по умолчанию». "собственность на что-то другое!"

Единственный безошибочный способ сделать это - напрямую отредактировать XML-файл .csproj и убедиться, что вы добавили True в элемент Reference:

<ItemGroup>
    <Reference Include="ConfigManagerClient, Version=1.0.0.0, Culture=neutral, PublicKeyToken=20fc1ffb797ec904, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\thirdparty\CM\ConfigManagerClient.dll</HintPath>
    <!-- If DevStudio inferred this to be true, then it won't explicitly save it.
         When the project is loaded on another machine on which the assembly is
         installed in the GAC,
         Dev Studio on _that_ machine will infer that CopyLocal should be False!!
     -->
    <Private>True</Private>
</Reference>

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

В конечном итоге вам будет гораздо лучше не доверять процесс сборки и упаковки Dev Studio, а вместо этого просто использовать, скажем, Nant и явные командные строки.

person Paul Hollingsworth    schedule 05.02.2009

Я думаю, вам, вероятно, не следует полагаться на то, что процесс сборки Visual Studio сделает это за вас автоматически, особенно когда результаты могут различаться в зависимости от строительной машины.

Что я бы сделал в этом случае (это применимо независимо от того, создаете ли вы с помощью Visual Studio или используете сценарий автоматической сборки), так это иметь некоторый сценарий после сборки (я обычно использую пакетные файлы для простоты), копирующий все сборки, необходимые вашему проекту, в соответствующий каталог сразу после сборки (я обычно храню все сборки, которые не являются частью моего проекта, в каталоге в моем исходном элементе управления, чтобы все они были в одном месте). Затем, когда вы соберете свой установщик, все будет именно там, где должно быть.

person TheSmurf    schedule 05.02.2009

Самый простой ответ - быть явным: добавьте ссылку на B.dll и настройте ее так, как вы хотите.

person Marc Gravell    schedule 05.02.2009