如何告诉NAnt使用VS2008在创建面向.NET 2.0的应用程序时使用的相同VB编译器?
我已将Web应用程序切换到VS2008,后向目标为.NET 2.0。一旦我这样做,我就可以运行NAnt(0.85rc4,0.85和0.86b1)。当我尝试使用一些VB9语法,它仍然可以很好地编译回VS2008中的.NET 2.0二进制文件时,如果你试图在VS2005中执行新语法,那么NAnt会遇到编译错误。不支持。
如果它有帮助,这里是我正在尝试的简化版本,只是一个简单的匿名委托,在我尝试使用NAnt构建2.0应用程序而不是VS2008之前效果很好。
Public Class SomeObject
Public Name As String
End Class
Private SomeList As List(Of SomeObject) = SomeObject.GetAllSomeObjects()
Public Function FindFirstItemWithSimilarName(ByVal x As String) As SomeObject
Return SomeList.Find(Function(p As SomeObject) p.Name.Contains(x))
End Function
编辑:除非有人能想到不这样做的理由,否则我的构建文件中的当前设置是这样的(因为我确实想要一个.NET 2.0应用程序,只需要一个更健壮的应用程序VB编译器):
<property name="nant.settings.currentframework" value="net-2.0"/>
答案 0 :(得分:0)
我想知道你是否必须change the framework NAnt正在运行。
另外,请查看NAntContrib项目。那有MSBuild任务。我们用这个来构建我们的2008项目,我们使用你想要的花式sytax糖,下降到2.0组件。我们必须要做的一件事是将C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727中的MSBuild.exe替换为将请求转发到3.0 MSBuild.exe
以下是我们用于替换2.0路径中的MSBuild.exe的代码。我不记得我在哪里得到这段代码。我试图在网上找到它,但不能。
将其构建到MSBuild.exe并将此2.0替换为此。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace MSBuild
{
public class Program
{
public static int Main(string[] args)
{
for (int argIndex = 0; argIndex < args.Length; argIndex++)
{
if (args[argIndex].Contains(" "))
{
string quotedArg = string.Format("\"{0}\"", args[argIndex]);
args[argIndex] = quotedArg;
}
}
string arguments = string.Join(" ", args);
// HACK: I should probably change
// this to automaticlaly
// determine the path
Process process = Process.Start("C:\\WINDOWS\\Microsoft.NET\\Framework\\v3.5\\MSBuild.exe",arguments);
process.WaitForExit();
return process.ExitCode;
}
}
}
答案 1 :(得分:0)
在我对NAnt的期望中,我对文字有点了解。由于我使用NAntContrib在项目上运行msbuild,我确实想要NAnt的net-3.5框架。 MSBuild和项目文件负责将项目反向定位到.NET 2.0。我能够获取我的VB匿名委托,将其编译为3.5并将生成的DLL直接放到只有.NET 2.0的机器上,并且运行正常。
只需将项目设置为编译为.NET 2.0:项目属性 - &gt;编译[tab] - &gt;高级编译选项... - &gt;目标框架(所有配置):.NET Framework 2.0
...告诉NAnt盲目假设net-3.5:
<property name="nant.settings.currentframework" value="net-3.5"/>