MSBuild引用程序集未包含在构建中

时间:2011-11-05 15:16:36

标签: msbuild csc

我可以使用以下命令构建我的项目......

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 个答案:

答案 0 :(得分:5)

您没有将您的Reference组连接到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> 

请注意,引用项指定引用的程序集的直接路径。

答案 1 :(得分:1)

您所做的是重载通常通过Microsoft.CSharp.targets导入的默认Build目标。在默认的构建目标中,它采用项目数组@(编译),其中.cs源文件驻留在其中,还有@(引用)数组,以及合成对C#编译器的正确调用。你在自己的最小Build目标中没有做过这样的事情,它有效地忽略了@(引用)的声明,只向Csc任务提供@(编译)。

尝试将References =“@(References)”属性添加到Csc任务。