我制作了一个小型C#应用程序,其中包含1个解决方案和2个项目(test1
,test2
)。第一个项目有两个文件Program.cs
和function1.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();
}
}
}
答案 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>
文件。
希望这会有所帮助。