使用Nant构建.NET 4.5项目

18

我想知道是否可以使用Nant来使用C# 5.0编译器针对.NET 4.5进行开发。目前最新版本只支持.NET 4.0。

我曾尝试下载源代码,并在安装了.NET 4.5框架后使用msbuild构建.sln文件,但是出现了大量错误。


我有点困惑,因为C# 5.0是.NET 4.5框架的一部分。如果你安装了.NET 4.5,难道不能使用msbuild进行编译吗? - Babak Naffas
1
是的,在Windows上您绝对可以使用MSBuild...但是如果您正在Linux或MacOS上构建Mono项目,则MSBuild将不可用 :) - Joel Martinez
1
我已经添加了一个对我有效的配置文件片段。 - skolima
2个回答

27

建议将您的发现发送到 NAnt邮件列表。虽然该列表并不是很活跃,但NAnt一定会更新以支持新框架。问题在于,Microsoft通常会在新发布中更改文件位置,并且指向这些文件的注册表键也会更改,因此在Microsoft有实际发布之前,不可能真正支持它。供测试使用。

我目前正在运行它,针对4.5版本。在NAnt.exe.config中,更改<startup>节点:

<startup>
    <!-- .NET Framework 4.5 -->
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
    <!-- .NET Framework 4.0 -->
    <supportedRuntime version="v4.0.30319" />
    <!-- .NET Framework 2.0 -->
    <supportedRuntime version="v2.0.50727" />
</startup>

我还添加了一个新的<framework>节点(与net-4.0相同,但引用程序集不同):

<framework
    name="net-4.5"
    family="net"
    version="4.5"
    description="Microsoft .NET Framework 4.5"
    sdkdirectory="${sdkInstallRoot}"
    frameworkdirectory="${path::combine(installRoot, 'v4.0.30319')}"
    frameworkassemblydirectory="${path::combine(installRoot, 'v4.0.30319')}"
    clrversion="4.0.30319"
    clrtype="Desktop"
    vendor="Microsoft"
      >
  <runtime>
    <probing-paths>
      <directory name="lib/common/2.0" />
      <directory name="lib/common/neutral" />
    </probing-paths>
    <modes>
      <strict>
        <environment>
          <variable name="COMPLUS_VERSION" value="v4.0.30319" />
        </environment>
      </strict>
    </modes>
  </runtime>
  <reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}">
    <include name="Accessibility.dll" />
    <include name="Microsoft.Build.Conversion.v4.0.dll" />
    <include name="Microsoft.Build.dll" />
    <include name="Microsoft.Build.Engine.dll" />
    <include name="Microsoft.Build.Framework.dll" />
    <include name="Microsoft.Build.Tasks.v4.0.dll" />
    <include name="Microsoft.Build.Utilities.v4.0.dll" />
    <include name="Microsoft.CSharp.dll" />
    <include name="Microsoft.Data.Entity.Build.Tasks.dll" />
    <include name="Microsoft.JScript.dll" />
    <include name="Microsoft.Transactions.Bridge.dll" />
    <include name="Microsoft.Transactions.Bridge.Dtc.dll" />
    <include name="Microsoft.VisualBasic.Activities.Compiler.dll" />
    <include name="Microsoft.VisualBasic.Compatibility.Data.dll" />
    <include name="Microsoft.VisualBasic.Compatibility.dll" />
    <include name="Microsoft.VisualBasic.dll" />
    <include name="Microsoft.VisualC.dll" />
    <include name="Microsoft.VisualC.STLCLR.dll" />
    <include name="mscorlib.dll" />
    <include name="System.Activities.Core.Presentation.dll" />
    <include name="System.Activities.dll" />
    <include name="System.Activities.DurableInstancing.dll" />
    <include name="System.Activities.Presentation.dll" />
    <include name="System.AddIn.Contract" />
    <include name="System.AddIn.dll" />
    <include name="System.ComponentModel.Composition.dll" />
    <include name="System.ComponentModel.DataAnnotations.dll" />
    <include name="System.Configuration.dll" />
    <include name="System.Configuration.Install.dll" />
    <include name="System.Core.dll" />
    <include name="System.Data.DataSetExtensions.dll" />
    <include name="System.Data.dll" />
    <include name="System.Data.Entity.Design.dll" />
    <include name="System.Data.Entity.dll" />
    <include name="System.Data.Linq.dll" />
    <include name="System.Data.OracleClient.dll" />
    <include name="System.Data.Services.Client.dll" />
    <include name="System.Data.Services.Design.dll" />
    <include name="System.Data.Services.dll" />
    <include name="System.Data.SqlXml.dll" />
    <include name="System.Deployment.dll" />
    <include name="System.Design.dll" />
    <include name="System.Device.dll" />
    <include name="System.DirectoryServices.dll" />
    <include name="System.DirectoryServices.Protocols.dll" />
    <include name="System.dll" />
    <include name="System.Drawing.Design.dll" />
    <include name="System.Drawing.dll" />
    <include name="System.Dynamic.dll" />
    <include name="System.EnterpriseServices.dll" />
    <include name="System.EnterpriseServices.Thunk.dll" />
    <include name="System.EnterpriseServices.Wrapper.dll" />
    <include name="System.IdentityModel.dll" />
    <include name="System.IdentityModel.Selectors.dll" />
    <include name="System.IO.Log.dll" />
    <include name="System.Management.dll" />
    <include name="System.Management.Instrumentation.dll" />
    <include name="System.Messaging.dll" />
    <include name="System.Net.dll" />
    <include name="System.Numerics.dll" />
    <include name="System.Runtime.Caching.dll" />
    <include name="System.Runtime.DurableInstancing.dll" />
    <include name="System.Runtime.Remoting.dll" />
    <include name="System.Runtime.Serialization.dll" />
    <include name="System.Runtime.Serialization.Formatters.Soap.dll" />
    <include name="System.Security.dll" />
    <include name="System.ServiceModel.Activation.dll" />
    <include name="System.ServiceModel.Activities.dll" />
    <include name="System.ServiceModel.Channels.dll" />
    <include name="System.ServiceModel.Discovery.dll" />
    <include name="System.ServiceModel.dll" />
    <include name="System.ServiceModel.Routing.dll" />
    <include name="System.ServiceModel.ServiceMoniker40.dll" />
    <include name="System.ServiceModel.WasHosting.dll" />
    <include name="System.ServiceModel.Web.dll" />
    <include name="System.ServiceProcess.dll" />
    <include name="System.Transactions.dll" />
    <include name="System.Web.Abstractions.dll" />
    <include name="System.Web.ApplicationServices.dll" />
    <include name="System.Web.DataVisualization.Design.dll" />
    <include name="System.Web.DataVisualization.dll" />
    <include name="System.Web.dll" />
    <include name="System.Web.DynamicData.Design.dll" />
    <include name="System.Web.DynamicData.dll" />
    <include name="System.Web.Entity.Design.dll" />
    <include name="System.Web.Entity.dll" />
    <include name="System.Web.Extensions.Design.dll" />
    <include name="System.Web.Extensions.dll" />
    <include name="System.Web.Mobile.dll" />
    <include name="System.Web.RegularExpressions.dll" />
    <include name="System.Web.Routing.dll" />
    <include name="System.Web.Services.dll" />
    <include name="System.Windows.Forms.DataVisualization.Design.dll" />
    <include name="System.Windows.Forms.DataVisualization.dll" />
    <include name="System.Windows.Forms.dll" />
    <include name="System.Workflow.Activities.dll" />
    <include name="System.Workflow.ComponentModel.dll" />
    <include name="System.Workflow.Runtime.dll" />
    <include name="System.WorkflowServices.dll" />
    <include name="System.Xaml.dll" />
    <include name="System.Xaml.Hosting.dll" />
    <include name="System.Xml.dll" />
    <include name="System.Xml.Linq.dll" />
  </reference-assemblies>
  <!-- WPF Assemblies -->
  <reference-assemblies basedir="${path::combine(installRoot, 'v4.0.30319')}/WPF">
    <include name="NaturalLanguage6.dll" />
    <include name="NlsData0009.dll" />
    <include name="NlsLexicons0009.dll" />
    <include name="PenIMC.dll" />
    <include name="PresentationCore.dll" />
    <include name="PresentationFramework.Aero.dll" />
    <include name="PresentationFramework.Classic.dll" />
    <include name="PresentationFramework.dll" />
    <include name="PresentationFramework.Luna.dll" />
    <include name="PresentationFramework.Royale.dll" />
    <include name="PresentationHost_v0400.dll" />
    <include name="PresentationNative_v0400.dll" />
    <include name="PresentationUI.dll" />
    <include name="ReachFramework.dll" />
    <include name="System.Printing.dll" />
    <include name="System.Speech.dll" />
    <include name="System.Windows.Input.Manipulations.dll" />
    <include name="System.Windows.Presentation.dll" />
    <include name="UIAutomationClient.dll" />
    <include name="UIAutomationClientsideProviders.dll" />
    <include name="UIAutomationProvider.dll" />
    <include name="UIAutomationTypes.dll" />
    <include name="WindowsBase.dll" />
    <include name="WindowsFormsIntegration.dll" />
    <include name="wpfgfx_v0400.dll" />
    <include name="wpftxt_v0400.dll" />
  </reference-assemblies>
  <reference-assemblies basedir="${environment::get-folder-path('ProgramFiles')}/Reference Assemblies/Microsoft/Framework/.NETFramework/v4.5">
    <include name="Microsoft.Build.Conversion.v4.0.dll" />
    <include name="Microsoft.Build.dll" />
    <include name="Microsoft.Build.Engine.dll" />
    <include name="Microsoft.Build.Framework.dll" />
    <include name="Microsoft.Build.Tasks.v4.0.dll" />
    <include name="Microsoft.Build.Utilities.v4.0.dll" />
    <include name="Microsoft.CSharp.dll" />
    <include name="Microsoft.JScript.dll" />
    <include name="Microsoft.VisualBasic.Compatibility.Data.dll" />
    <include name="Microsoft.VisualBasic.Comptatibility.dll" />
    <include name="Microsoft.VisualBasic.dll" />
    <include name="Microsoft.VisualC.dll" />
    <include name="Microsoft.VisualC.STLCLR.dll" />
    <include name="mscorlib.dll" />
    <include name="PresentationBuildTasks.dll" />
    <include name="PresentationCore.dll" />
    <include name="WindowsBase.dll" />
    <include name="PresentationFramework.dll" />
    <include name="PresentationFramework.Aero.dll" />
    <include name="PresentationFramework.Classic.dll" />
    <include name="PresentationFramework.Luna.dll" />
    <include name="PresentationFramework.Royale.dll" />
    <include name="ReachFramework.dll" />
    <include name="System.Activities.Core.Presentation.dll" />
    <include name="System.Activities.dll" />
    <include name="System.Activities.DurableInstancing.dll" />
    <include name="System.Activities.Presentation.dll" />
    <include name="System.AddIn.Contract.dll" />
    <include name="System.AddIn.dll" />
    <include name="System.ComponentModel.Composition.dll" />
    <include name="System.ComponentModel.DataAnnotations.dll" />
    <include name="System.Configuration.dll" />
    <include name="System.Core.dll" />
    <include name="System.Data.DataSetExtension.dll" />
    <include name="System.Data.dll" />
    <include name="System.Data.Entity.Design.dll" />
    <include name="System.Data.Entity.dll" />
    <include name="System.Data.Linq.dll" />
    <include name="System.Data.OracleClient.dll" />
    <include name="System.Data.Services.Client.dll" />
    <include name="System.Data.Services.Design.dll" />
    <include name="System.Data.Services.dll" />
    <include name="System.Data.SqlXml.dll" />
    <include name="System.Deployment.dll" />
    <include name="System.Design.dll" />
    <include name="System.Device.dll" />
    <include name="System.DirectoryServices.AccountManagement.dll" />
    <include name="System.DirectoryServices.dll" />
    <include name="System.DirectoryServices.Protocols.dll" />
    <include name="System.dll" />
    <include name="System.Drawing.Design.dll" />
    <include name="System.Drawing.dll" />
    <include name="System.EnterpriseServices.dll" />
    <include name="System.EnterpriseServices.Thunk.dll" />
    <include name="System.EnterpriseServices.Wrapper.dll" />
    <include name="System.IdentityModel.dll" />
    <include name="System.IdentityModel.Selectors.dll" />
    <include name="System.IO.Log.dll" />
    <include name="System.Management.dll" />
    <include name="System.Management.Instrumentation.dll" />
    <include name="System.Messaging.dll" />
    <include name="System.Net.dll" />
    <include name="System.Numerics.dll" />
    <include name="System.Printing.dll" />
    <include name="System.Runtime.Caching.dll" />
    <include name="System.Runtime.DurableInstancing.dll" />
    <include name="System.Runtime.Remoting.dll" />
    <include name="System.Runtime.Serialization.dll" />
    <include name="System.Runtime.Serialization.Formatters.Soap.dll" />
    <include name="System.Security.dll" />
    <include name="System.ServiceModel.Activation.dll" />
    <include name="System.ServiceModel.Activities.dll" />
    <include name="System.ServiceModel.Channels.dll" />
    <include name="System.ServiceModel.Discovery.dll" />
    <include name="System.ServiceModel.dll" />
    <include name="System.ServiceModel.Routing.dll" />
    <include name="System.ServiceModel.Web.dll" />
    <include name="System.ServiceProcess.dll" />
    <include name="System.Speech.dll" />
    <include name="System.Transactions.dll" />
    <include name="System.Web.Abstractions.dll" />
    <include name="System.Web.ApplicationServices.dll" />
    <include name="System.Web.DataVisualization.Design.dll" />
    <include name="System.Web.DataVisualization.dll" />
    <include name="System.Web.dll" />
    <include name="System.Web.DynamicData.Design.dll" />
    <include name="System.Web.DynamicData.dll" />
    <include name="System.Web.Entity.Design.dll" />
    <include name="System.Web.Entity.dll" />
    <include name="System.Web.Extensions.Design.dll" />
    <include name="System.Web.Extensions.dll" />
    <include name="System.Web.Mobile.dll" />
    <include name="System.Web.RegularExpressions.dll" />
    <include name="System.Web.Routing.dll" />
    <include name="System.Web.Services.dll" />
    <include name="System.Windows.Forms.DataVisualization.Design.dll" />
    <include name="System.Windows.Forms.DataVisualization.dll" />
    <include name="System.Windows.Forms.dll" />
    <include name="System.Windows.Input.Manipulations.dll" />
    <include name="System.Windows.Presentation.dll" />
    <include name="System.Workflow.Activities.dll" />
    <include name="System.Workflow.ComponentModel.dll" />
    <include name="System.Workflow.Runtime.dll" />
    <include name="System.WorkflowServices.dll" />
    <include name="System.Xaml.dll" />
    <include name="System.Xml.dll" />
    <include name="System.Xml.Linq.dll" />
  </reference-assemblies>
  <task-assemblies>
    <!-- include MS.NET version-neutral assemblies -->
    <include name="extensions/net/neutral/**/*.dll" />
    <!-- include MS.NET 4.0 specific assemblies -->
    <include name="extensions/net/4.0/**/*.dll" />
    <!-- include MS.NET specific task assembly -->
    <include name="NAnt.MSNetTasks.dll" />
    <!-- include MS.NET specific test assembly -->
    <include name="NAnt.MSNet.Tests.dll" />
    <!-- include .NET 4.0 specific assemblies -->
    <include name="extensions/common/4.0/**/*.dll" />
  </task-assemblies>
  <tool-paths>
    <directory name="${sdkInstallRoot}"
        if="${property::exists('sdkInstallRoot')}" />
    <directory name="${path::combine(installRoot, 'v4.0.30319')}" />
  </tool-paths>
  <project>
    <readregistry
        property="installRoot"
        key="SOFTWARE\Microsoft\.NETFramework\InstallRoot"
        hive="LocalMachine" />
    <locatesdk property="sdkInstallRoot" minwinsdkver="v7.0A" minnetfxver="4.0" maxnetfxver="4.0.99999" failonerror="false" />
  </project>
  <tasks>
    <task name="csc">
      <attribute name="supportsnowarnlist">true</attribute>
      <attribute name="supportswarnaserrorlist">true</attribute>
      <attribute name="supportskeycontainer">true</attribute>
      <attribute name="supportskeyfile">true</attribute>
      <attribute name="supportsdelaysign">true</attribute>
      <attribute name="supportsplatform">true</attribute>
      <attribute name="supportslangversion">true</attribute>
    </task>
    <task name="vbc">
      <attribute name="supportsdocgeneration">true</attribute>
      <attribute name="supportsnostdlib">true</attribute>
      <attribute name="supportsnowarnlist">true</attribute>
      <attribute name="supportskeycontainer">true</attribute>
      <attribute name="supportskeyfile">true</attribute>
      <attribute name="supportsdelaysign">true</attribute>
      <attribute name="supportsplatform">true</attribute>
      <attribute name="supportswarnaserrorlist">true</attribute>
    </task>
    <task name="jsc">
      <attribute name="supportsplatform">true</attribute>
    </task>
    <task name="vjc">
      <attribute name="supportsnowarnlist">true</attribute>
      <attribute name="supportskeycontainer">true</attribute>
      <attribute name="supportskeyfile">true</attribute>
      <attribute name="supportsdelaysign">true</attribute>
    </task>
    <task name="resgen">
      <attribute name="supportsassemblyreferences">true</attribute>
      <attribute name="supportsexternalfilereferences">true</attribute>
    </task>
    <task name="delay-sign">
      <attribute name="exename">sn</attribute>
    </task>
    <task name="license">
      <attribute name="exename">lc</attribute>
      <attribute name="supportsassemblyreferences">true</attribute>
    </task>
  </tasks>
</framework>

1
我的公司有一个使用NAnt的旧构建系统。是否有适用于4.6的更新版本?C#6在4.5版本下无法正确构建。(不用说,我正在推动新的构建流程,但可能需要一段时间才能迁移所有内容)。 - WillC

2

nAnt已发布0.92版,因此它并没有停止更新。不过目前还不确定何时会支持csc 5.0。

既然您提到了在其本地环境中构建Mono,Mono项目有自己的msbuild克隆版本,称为xbuild(http://www.mono-project.com/Microsoft.Build)。他们说它并不完全支持全部功能,但没有给出任何细节。我猜,除非您在做一些特别的事情,否则它可能会正常工作。我建议您尝试从命令行调用xbuild,并将解决方案作为第一个快速测试。

祝好,迈克尔


“xbuild”现在被认为是过时的,但显然“nAnt”包括“msbuild”,它似乎运行良好... - Gwyneth Llewelyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接