簡體   English   中英

在.NET 2.0中使用.NET 3.5類

[英]Using .NET 3.5 classes in .NET 2.0

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

謝謝,馬里奧斯

您想使用什么類型? 從理論上講,可以使用某些類型,因為.NET 3.5程序集是為.NET 2.0運行時編譯的。 但是,請注意,通常.NET 3.5程序集將要求安裝.NET 3.5 Framework,因為.NET 3.5中的功能不僅僅包括程序集(例如,用於WPF的服務等)。

如果您不希望隨應用程序一起部署.NET 3.5 Framework,建議您查看.NET 3.5 Client概要文件 ,該概要文件經過簡化后可以滿足大多數桌面應用程序的需求。

這個問題讓我感到奇怪,因此我對此進行了深入研究。

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

真正的最佳答案是硬着頭皮安裝必要的框架。 但是,如果只需要從.net 3.0分發單個程序集,則可能是可行的。 我很確定,要求3.5以上的組件需要安裝3.0。 到那時,不安裝3.5將無濟於事。

這是我從3.0到2.0的裝配體所做的黑客攻擊:

Hack#1將引用添加到所需的3.0。 Visual Studio應該抱怨。 卸載項目並編輯項目文件。 從xml中刪除此行,然后重新加載項目。

<RequiredTargetFramework>3.0</RequiredTargetFramework>

Visual Studio現在將愉快地編譯並使用此程序集運行。

Hack#2將程序集引用列表中的copy local屬性更改為true。

hack#3(最丑陋的hack),修改機器配置以添加所需程序集的config部分。 這可能需要也可能不需要,這取決於您要引入的程序集。在我的測試中,我引用了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;
}

……再次,我不推薦這樣做。 但是,如果您真的很絕望,則有可能改變規則。

一點也不。 如果要運行.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

.NET 3.5並沒有什么特別的,它只是一堆添加的程序集(如Linq)。 與.NET 3.0相同(如WPF)。 .NET Framework 2.0至3.5 SP1仍使用相同版本的CLR,即2.0版。

因此,使您的程序依賴於.NET 3.5是一個非常明智的決定,它需要Project + Add Reference並選擇具有3.5.0.0版本號的程序集。 完成此操作后,客戶需要在其計算機上安裝相同的程序集。 這要求在她的計算機上安裝框架的.NET 3.5版本。

大多數客戶已經擁有它,它由Windows Update分發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM