0

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

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

尽管如此,我首先将引用添加到test2.csproj,然后添加到.dll它创建的引用,并且还使用了该using指令。

当我尝试在命令提示符下运行时会出现同样的错误, csc.exe program.cs function1.cs 但可以通过添加/:rwith来快速修复.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();

    }
 }
}
4

1 回答 1

0

创建增量构建时出现 CS0246 错误

构建时应指定引用csc.exe,如References="..\test2\bin\Debug\test2.dll",否则 csc.exe 无法知道 test.dll 被 test1.project 引用,因此目标Compile如下所示:

<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>

此外,AFAIK,您不应编辑该 .csproj(或编写我自己的)以直接实现增量构建。那是因为你在构建项目test1时,Visual Studio/MSBuild已经默认使用增量构建,我们不需要再次增量构建。如果要实现增量构建,可以创建一个迷你 MSBuild 项目文件来实现增量构建。我Test.proj使用以下代码在 test1 项目文件夹下创建了一个新文件夹:

<?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>

Test.proj然后我们可以使用 MSBuild 命令行构建这个文件。

希望这可以帮助。

于 2018-08-02T08:15:55.547 回答