如何告诉 NAnt 使用与 VS2008 创建 .NET 2.0 目标应用程序时使用的相同 VB 编译器?
我已将 Web 应用程序切换到 VS2008,目标是 .NET 2.0。执行此操作后,我可以很好地运行 NAnt(0.85rc4、0.85 和 0.86b1)。当我尝不支持)。
如果它有帮助,这里是我正在尝试的简化版本,只是一个简单的匿名委托,在我尝试使用 NAnt 而不是 VS2008 构建 2.0 应用程序之前它工作得很好。
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"/>
我想知道你是否必须更改 NAnt 运行的框架。
另外,请查看 NAntContrib 项目。那有 MSBuild 任务。我们用它来构建 2008 年的项目,其中我们使用像您想要的那样的花哨的语法糖,低至 2.0 程序集。我们必须做的一件事是将 C:\WINDOWS\Microsoft.NET\Framework 2.0.50727 中的 MSBuild.exe 替换为将请求转发到 3.0 MSBuild.exe 的 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;
}
}
}
只需将项目设置为编译为 .NET 2.0:项目属性 -> 编译 [选项卡] -> 高级编译选项... -> 目标框架(所有配置):.NET Framework 2.0
...并告诉 NAnt 盲目地假设 net-3.5:
<property name="nant.settings.currentframework" value="net-3.5"/>