2010-01-14 128 views
1

我希望能夠在基於.NET 2.0的應用程序中使用.NET 3.5類型。 基本上我們沒有在桌面上部署.NET 3.5庫,但我們需要從那裏使用一些類。任何想法如何可能?在.NET 2.0中使用.NET 3.5類

感謝, 馬里奧斯

+1

只要您不使用.NET 3.5功能,您可以將其編譯爲.NET 2.0。 – ChaosPandion 2010-01-14 00:17:22

+0

完全重複:http://stackoverflow.com/questions/814085/using-net-framework-3-5-features-in-net-framework-2-0/ – 2010-01-14 02:41:25

回答

2

這個問題讓我想知道,所以我深入瞭解了一下。

您的問題的答案取決於您對新框架有多少依賴關係,以及您願意做多少黑客行爲。

real最好的答案就是硬着頭皮安裝必要的框架。但是,如果您只需從.net 3.0發佈單個程序集,則可能會發生這種情況。我很確定,要求從3.5開始的程序集需要安裝3.0。在這一點上,你沒有安裝3.5沒有任何好處。

這裏的黑客我也從2.0製作裝配3.0工作:

哈克#1 參考添加到所需要的3.0。 Visual Studio應該抱怨。卸載項目並編輯項目文件。從xml中刪除此行並重新加載項目。

<RequiredTargetFramework>3.0</RequiredTargetFramework> 

Visual Studio將很高興地編譯並使用此程序集運行。

哈克#2 更改複製本地財產集引用列表爲true。

黑客#3(最醜的黑客) 修改機器配置,爲所需的程序集添加配置部分。這可能需要,也可能不需要,具體取決於您要使用的程序集。在我的測試中,我引用了System.Runtime.Serialization程序集,並需要將此部分從我的3.5機器上的machine.config複製到我的2.0機器。

<sectionGroup name="system.runtime.serialization" type="System.Runtime.Serialization.Configuration.SerializationSectionGroup, System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
    <section name="dataContractSerializer" type="System.Runtime.Serialization.Configuration.DataContractSerializerSection, System.Runtime.Serialization, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 

一旦我做到了,下面的代碼運行在我的。NET 2.0對箱就好了。

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     try 
     { 
      Console.WriteLine("Testing serialization"); 

      DataContractSerializer formatter = new DataContractSerializer(typeof(Junk)); 
      MemoryStream stream = new MemoryStream(); 

      Junk junk = new Junk(); 
      junk.Name = "Junk"; 
      junk.Value = 15; 

      formatter.WriteObject(stream, junk); 
      Console.WriteLine("Wrote object to stream"); 

      stream.Seek(0, SeekOrigin.Begin); 

      Junk savedJunk = formatter.ReadObject(stream) as Junk; 

      Console.WriteLine("Deserialized name = {0}", savedJunk.Name); 
      Console.WriteLine("Deserialized value = {0}", savedJunk.Value); 

      Console.WriteLine("Testing complete"); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      Console.WriteLine(ex.StackTrace); 
     } 
    } 
} 

[DataContract] 
class Junk 
{ 
    [DataMember] 
    public string Name = ""; 
    [DataMember] 
    public int Value = 0; 
} 

...再次,我不建議這樣做。但是,如果你真的絕望,可能會改變規則。

1

不是。如果你想運行.NET 3.5代碼,你需要在一臺機器上安裝.NET Runtime 3.5。如果您使用2.0部署到機器,您將需要創建不依賴3.5的項目。

以下是關於如何使用VS2008創建針對.NET 2.0的項目的一些信息。

http://weblogs.asp.net/scottgu/archive/2007/06/20/vs-2008-multi-targeting-support.aspx

+0

我聽說過從3.5中提取IL的方法類,並重新生成C#代碼。不知道這是否屬實。 – koumides 2010-01-14 00:26:49

+0

這聽起來比解決.NET 2.0上缺少的功能更難。你想要什麼LINQ嗎?在那種情況下,你被擰緊了。儘管如此,使用別的方法替換它可能會更容易,而不是破解IL(如果甚至可能的話)。 – 2010-01-14 00:33:40

+0

部署到.NET 2.0(SP1)目標時可以使用Linq。有幾種可能性,你可以使用LinqBridge(http://www.albahari.com/nutshell/linqbridge.aspx)或http://linqinaction.net/blogs/main/archive/2007/09/05/linq-support-on- net-2.0.aspx – 2010-01-14 00:45:27

2

你想要什麼類型的使用?理論上可以使用某些類型,因爲.NET 3.5程序集是爲.NET 2.0運行時編譯的。但是,請注意,通常.NET 3.5程序集將需要安裝.NET 3.5 Framework,因爲.NET 3.5中不僅僅是程序集(例如用於WPF的服務),還有更多。

如果你不想部署與應用程序的.NET 3.5框架,我建議你去看看在.NET 3.5客戶端配置文件,減少變異,這將是足以滿足大多數桌面應用程序。

1

.NET 3.5沒有什麼特別的地方,它只是一堆附加的程序集(比如Linq)。相同的.NET 3.0(如WPF)。 .NET框架2.0到3.5 SP1仍使用相同版本的CLR版本2.0。

所以這是一個非常有意識的決定,使您的程序依賴於.NET 3.5,它需要Project + Add Reference並選擇一個具有3.5.0.0版本號的程序集。一旦你這樣做了,你的客戶端需要在她的機器上安裝相同的程序集。這需要在其機器上安裝.NET 3.5版本的框架。

大多數客戶端已經擁有它,它通過Windows Update獲得分佈。

+0

「這只是一堆程序集」:當然有很多新的程序集(運行時是相同的),但不要忘記,可能還有其他註冊表項,COM或本地依賴項或像PresentationFontCache這樣的服務要成立。 – 2010-01-14 00:48:19