Ссылочная сборка MSBuild не включена в сборку - PullRequest
2 голосов
/ 05 ноября 2011

Я могу построить свой проект с помощью следующей команды ...

csc /reference:lib\Newtonsoft.Json.dll SomeSourceFile.cs

... но когда я использую эту команду ...

msbuild MyProject.csproj

... со следующим файлом .csproj моя ссылка .dll не включена. Есть мысли?

<PropertyGroup>
    <AssemblyName>MyAssemblyName</AssemblyName>
    <OutputPath>bin\</OutputPath>
</PropertyGroup>

<ItemGroup>
    <Compile Include="SomeSourceFile.cs" />
</ItemGroup>

<ItemGroup>
    <Reference Include="Newtonsoft.Json">
        <HintPath>lib\Newtonsoft.Json.dll</HintPath>
    </Reference>
</ItemGroup>

<Target Name="Build">
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" />
    <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
</Target>

Ответы [ 2 ]

5 голосов
/ 06 ноября 2011

Вы не подключили свою Контрольную группу к задаче Csc.Также ссылки, которые вы указали, не могут быть использованы непосредственно внутри задачи.Задачи, поставляемые с MSBuild, включают ResolveAssemblyReference, который способен преобразовывать короткие имена сборок и подсказки поиска в пути к файлам.Вы можете увидеть, как он используется внутри c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets.

Без ResolveAssemblyReference простейшая вещь, которую вы можете сделать, это написать так:

<PropertyGroup> 
    <AssemblyName>MyAssemblyName</AssemblyName> 
    <OutputPath>bin\</OutputPath> 
</PropertyGroup> 

<ItemGroup> 
     <Compile Include="SomeSourceFile.cs" /> 
</ItemGroup> 

<ItemGroup> 
    <Reference Include="lib\Newtonsoft.Json.dll" />
</ItemGroup> 

<Target Name="Build"> 
    <MakeDir Directories="$(OutputPath)" Condition="!Exists('$(OutputPath)')" /> 
    <Csc Sources="@(Compile)" References="@(Reference)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" /> 
</Target> 

Обратите внимание, что элемент Reference указывает прямой путь к ссылочной сборке.

1 голос
/ 06 ноября 2011

Что вы сделали, так это перегрузили цель сборки по умолчанию, обычно импортируемую через Microsoft.CSharp.targets. В цели Build по умолчанию он принимает массив item @ (Compile), в котором находятся исходные файлы .cs, а также массив @ (Reference), помимо прочего, и создает правильный вызов компилятора C #. Вы не сделали ничего подобного в своей собственной минимальной цели Build, которая фактически игнорирует объявление @ (Reference) и предоставляет только @ (Compile) для задачи Csc.

Попробуйте добавить атрибут References = "@ (References)" в задачу Csc.

...