0

我试图了解使用 Microsoft Build Engine(也称为 MSBuild)构建 C# 项目的过程,但我遇到了问题。问题很简单,我想我只是不明白一些事情。

我编写了一个由 2 个 .cs 文件组成的简单程序。第一个文件是“MathOp.cs”。在这个文件中,我定义了 2 个函数:add(double num1, double num2) 和 multiply(doble, double); 第二个文件是“Program.cs”。在这里,我定义了两个变量,我将它们传递给添加放在 MathOp 文件中的函数并获取 rezult;这个程序是正确的。

然后我编写了一个简单的 msbuild 文件,在其中定义了要构建的任务和目标。当我在 Visual Studio 命令提示符下启动它时,我得到错误 cs0234:在系统命名空间中找不到类型或命名空间名称 Linq。最有趣的是我在 msbuild 文件中引用了 System.dll 等。如果我在 Program.cs 文件中评论 using 指令,这个错误就会消失。

<Project DefaultTargets="Compile"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
<PropertyGroup>
    <AssemblyInfo>Build</AssemblyInfo>
    <builtdir>Build\</builtdir>
</PropertyGroup>

<ItemGroup>
    <CSFile Include="msbuildTest\Program.cs"/>
    <CSFile Include="msbuildTest\Properties\AssemblyInfo.cs"/>
    <CSFile Include="msbuildTest\MathOp.cs"/>

    <Reference Include="System.dll"/>
    <Reference Include="System.Data.dll"/>
    <Reference Include="System.Drawing.dll"/>
    <Reference Include="System.Windows.Forms.dll"/>
    <Reference Include="System.XML.dll"/>
</ItemGroup>

<Target Name="PreBuild">
    <Exec Command="if not exist $(builtdir) md $(builtdir)"/>
</Target>

<Target Name="Compile" DependsOnTargets="PreBuild">
    <Csc Sources="@(CSFile)"
        References="@(Reference)"
        OutputAssembly="$(builtdir)$(MSBuildProjectName).exe"
        TargetType="exe"/>
</Target>

<Target Name="Clean" >
    <Exec Command="DEL $(builtdir)$(AssemblyInfo).exe"/>
</Target>
<Target Name="Rebuild" DependsOnTargets="Clean;Compile"/>

4

1 回答 1

2

在当前状态下,msbuild 将使用来自 .Net 2.0的 CSC ,它对 Linq 一无所知。

解决问题的最简单方法是在 msbuild 项目中指定 4.0 版本,从而强制 msbuild 使用正确的 CSC 版本:

<Project ToolsVersion="4.0"
    DefaultTargets="Compile"
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" >
于 2013-04-01T14:02:43.223 回答