4

我有一個VS2005解決方案,並希望在新的一年下車VS2005。我對升級過程感到非常滿意,並且驚喜地發現我的構建腳本大多仍然有效。針對.NET 2.0的VS2008並沒有阻止我使用C#3功能

我的問題是圍繞多目標功能 - 我沒有在我的服務器上安裝.NET 3.5,所以我必須繼續以.NET 2.0爲目標。主要是,但我發現我可以做的事情,如

var returnMe = "result: " + result.ToString(); 

...並仍然調試項目成功。

當我將代碼提交到構建服務器時,構建失敗,說「var」未定義。

那麼,我應該期待什麼?

  1. VS2008,針對.NET 2.0,當我嘗試做C#3事情
  2. 構建服務器,是知道我針對.NET 2.0應該拋出錯誤,應該明白我在做什麼,編譯成2.0兼容二進制

任何想法?

+1

'var'不是.Net功能 - 它是C#功能。 – 2010-01-22 16:30:10

回答

5

問題似乎是構建服務器沒有正確的編譯器。你可以在你的工作站上構建它,對吧?

許多.NET 3.0「功能」只是在編譯時恢復爲CLR 2代碼的語法位。 var就是其中之一 - 編譯時,編譯器將var轉換爲適當的類型。

在燈架上有一個非常豐富的職位在http://weblogs.asp.net/shahar/archive/2008/01/23/use-c-3-features-from-c-2-and-net-2-0-code.aspx

+0

將你來看...... Ç:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ MSBuild.exe [......] 我打賭,如果我在指出這會工作不同的MSBuild ...謝謝 – dnord 2010-01-22 18:01:41

1

當您使用Visual Studio 2008來定位2.0運行時時,您仍在使用C#編譯器的3.0版本來編譯您的代碼。 CLR運行時本身在2005年和2008年之間並沒有太大變化。它實際上僅僅是核心CLR的一個服務包,還增加了一些新的庫(特別是System.Core.dll)。

因此,2008年添加的大部分功能在2.0運行時工作得很好。這是完全合法的,如果您嘗試使用在2.0中不起作用的功能,您將在構建時或發佈時遇到錯誤。

0

如果你想針對特定的構建,您可以通過配置設置做到這一點(這正是我剛剛讀了對70-536考試,非常乾燥的東西!)。

添加的東西就像你app.exe.config文件中的以下

<configuration> 
    <startup> 
     <requiredRuntime version="v2.0.50727"/> 
    </startup> 
</configuration> 

然後,您可以強制所有的構建使用相同版本的計較機,應該可以幫助您以強制調試才能使用正確的版本。

0

如果不使用下面的庫/技術:

  • 的Windows Presentation Foundation(WPF)
  • Windows通訊基礎(WCF)
  • Windows工作流基礎(WWF)
  • 的Windows卡空間(WCS)

那麼你或多或少是在安全的一面,雖然我會建議徹底無論如何測試。

你可以使用.Net 3.0的功能,如var等,只是因爲VS2008並不關心框架的目標版本,當涉及到動態語法檢查,IntelliSence和其他可能。據我所知VS2010 注意這些事情,這將阻止你成功編譯你的「var x = ...」結構時,目標2.0框架版本。

1

正如其他人所說,C#3.0特徵可以靶向與C#3.0的編譯器的.NET 2.0運行時使用。

與此相關的一個鮮爲人知的事實是,你甚至可以中使用LINQ和.NET 2.0,如果提供自己的LINQ實現。

下面是使「選擇」的例子,「在那裏」運營商:

namespace System.Runtime.CompilerServices 
{ 
    // defining this attribute allows using extension methods with .NET 2.0 
    [AttributeUsage(AttributeTargets.Method)] 
    public sealed class ExtensionAttribute : Attribute {} 
} 

namespace System 
{ 
    public delegate R Func<A, R>(A arg0); 
} 

namespace System.Linq 
{ 
    public static class Enumerable 
    { 
     public static IEnumerable<R> Select<T, R>(this IEnumerable<T> input, Func<T, R> f) 
     { 
      foreach (T element in input) 
       yield return f(element); 
     } 

     public static IEnumerable<T> Where<T>(this IEnumerable<T> input, Func<T, bool> f) 
     { 
      foreach (T element in input) { 
       if (f(element)) 
        yield return element; 
      } 
     } 
    } 

你可以出貨單聲道的版本System.Core程序與應用程序中,如果你想在.NET充分利用LINQ的2.0。

相關問題