Делать процесс сборки независимым от GAC - PullRequest
4 голосов
/ 05 февраля 2009

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

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

Предположительно, это потому, что dev studio предполагает, что, поскольку она установлена ​​в 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 не копируется в выходной каталог.

Ответы [ 3 ]

4 голосов
/ 05 февраля 2009

Как предложил Марк, единственный способ сделать это - добавить зависимые ссылки и установить 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 и явные командные строки.

1 голос
/ 05 февраля 2009

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

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

0 голосов
/ 05 февраля 2009

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

...