创建增量版本时出现CS0246错误

时间:2018-08-01 10:51:35

标签: c# msbuild visual-studio-2017 incremental-build

我制作了一个小型C#应用程序,其中包含1个解决方案和2个项目(test1test2)。第一个项目有两个文件Program.csfunction1.cs,而第二个项目仅包含Program2.cs。 项目test1创建.exe文件,而test2创建.dll文件。 问题是当我尝试在VS创建.csproj时构建它时,它运行良好,但是当我尝试编辑该.csproj(或编写自己的文件)以实现增量构建(例如在MS网站上的示例)时,它会抛出一个错误。 CS0246

  

找不到类型或名称空间名称'type / namespace'(您是否缺少using指令或程序集引用?)

尽管我先将引用添加到test2.csproj,然后再添加到它创建的.dll,也使用using指令。

当我尝试在命令提示符下运行时,会发生相同的错误 csc.exe program.cs function1.cs,但可以通过将/:r.dll相加来快速解决,例如:

\csc.exe program.cs function1.cs /r:test2.dll 然后运行正常。我只是不知道如何在文件之间确认该引用的msbuild。而且我也被迫使用cmd而不是在VS中构建它。

下面,我将在项目中使用的代码放入

这是我要在test1.csproj末尾添加的代码段,以强制其进行增量构建:

<ItemGroup>
<Compile Include="function1.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<Target Name="program2">
   <MSBuild Projects="..\test2\test2.csproj" />
   <Message Text="Target program 2" />
</Target>
<Target Name="Compile" Inputs="@(Compile)" Outputs="$(OutputPath)   $(AssemblyName).exe" DependsOnTargets="program2">
   <Message Text="Target program 1" />
   <MakeDir Directories="$(OutputPath)" Condition="!Exists('$OutputPath)')" />
   <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" />
</Target>

这是Program.cs的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace test1
{
class Program
  {
    static void Main(string[] args)
    {
        int a;
        int b;
        string pause;
        function1 var = new function1();
        a = Convert.ToInt32(Console.ReadLine());
        b = var.funkcja1(a);
        Console.WriteLine(b);
        pause = Console.ReadLine();
    }
  }
}

这里是function1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using test2;
namespace test1
{
class function1
 {
    public int funkcja1(int a)
    {
        int b;
        Program2 p2 = new Program2();
        b = p2.program2(a);
        return (b);
    }
 }
}

这是Program2.cs的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace test2
{
public class Program2
 {
    public class function2
    {
        public int funkcja2(int a)
        {
            return (a + 1);
        }
    }
    public int program2(int c)
    {
        int d;
        function2 var = new function2();
        d = var.funkcja2(c) + 1;
        return (d);
    }
    public static void Main(string[] args)
    {

        string pause;
        pause = Console.ReadLine();

    }
 }
}

1 个答案:

答案 0 :(得分:0)

  创建增量版本时出现

CS0246错误

使用csc.exe(例如References="..\test2\bin\Debug\test2.dll")构建引用时,应指定引用,否则csc.exe无法知道test1.project引用了test.dll,因此目标{ {1}}看起来像:

Compile

此外,AFAIK还应该编辑.csproj(或编写我自己的)以直接实现增量构建。那是因为在生成项目test1时,Visual Studio / MSBuild在默认情况下已使用增量生成,因此我们无需再次进行增量生成。如果要实施增量构建,可以create a mini MSBuild Project File实施增量构建。我在test1项目文件夹下使用以下代码创建了一个新的<Target Name="Compile" Inputs="@(Compile)" Outputs="$(OutputPath) $(AssemblyName).exe" DependsOnTargets="program2"> <Message Text="Target program 1" /> <MakeDir Directories="$(OutputPath)" Condition="!Exists('$OutputPath)')" /> <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" References="..\test2\bin\Debug\test2.dll" /> </Target>

Test.proj

然后,我们可以使用MSBuild命令行构建此<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Compile" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemGroup> <Compile Include="function1.cs" /> <Compile Include="Program.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> </ItemGroup> <PropertyGroup> <AssemblyName>MSBuildTestSample</AssemblyName> <OutputPath>Bin\</OutputPath> </PropertyGroup> <Target Name="program2"> <MSBuild Projects="..\test2\test2.csproj" /> <Message Text="Target program 2" /> </Target> <Target Name="Compile" Inputs="@(Compile)" Outputs="$(OutputPath) $(AssemblyName).exe" DependsOnTargets="program2"> <Message Text="Target program 1" /> <MakeDir Directories="$(OutputPath)" Condition="!Exists('$OutputPath)')" /> <Csc Sources="@(Compile)" OutputAssembly="$(OutputPath)$(AssemblyName).exe" References="..\test2\bin\Debug\test2.dll" /> </Target> </Project> 文件。

希望这会有所帮助。