2

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

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>

4

2 回答 2

5

您没有让您的参考组连接到 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> 

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

于 2011-11-05T20:17:33.173 回答
1

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

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

于 2011-11-05T20:22:09.563 回答