在.NET 2.0中使用.NET 3.5类

时间:2010-01-14 00:13:53

标签: c# .net .net-3.5

我希望能够在基于.NET 2.0的应用程序中使用.NET 3.5类型。 基本上我们没有在桌面上部署.NET 3.5库,但我们需要从那里使用一些类。任何想法如何可能?

谢谢, 马里奥斯

4 个答案:

答案 0 :(得分:2)

您想使用哪种类型?理论上可以使用某些类型,因为.NET 3.5程序集是为.NET 2.0运行时编译的。但是,请注意,通常.NET 3.5程序集将需要安装.NET 3.5 Framework,因为.NET 3.5中的内容多于程序集(例如WPF服务等)。

如果您不想在应用程序中部署.NET 3.5 Framework,我建议您查看 .NET 3.5客户端配置文件,这是一个简化的变体,足以满足您的要求。大多数桌面应用程序。

答案 1 :(得分:2)

这个问题让我感到疑惑,所以我稍微挖了一下。

您的问题的答案取决于您对新框架的依赖程度,以及您愿意做多少黑客攻击。

真正的最佳答案是咬紧牙关并安装必要的框架。但是,如果您只需要从.net 3.0分发单个程序集,则可能。我很确定,要求3.5的程序集需要安装3.0。此时,如果不安装3.5,则无济于事。

这是我从3.0开始从3.0工作组装的黑客行为:

Hack#1 添加对所需3.0的引用。 Visual Studio应该抱怨。卸载项目并编辑项目文件。从xml中删除该行并重新加载项目。

<RequiredTargetFramework>3.0</RequiredTargetFramework>

Visual Studio现在很乐意使用此程序集进行编译和运行。

Hack#2 将程序集引用列表中的复制本地属性更改为true。

Hack#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;
}
再次,我不推荐这个。但是,如果你真的很绝望,可能会改变规则。

答案 2 :(得分: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

答案 3 :(得分:1)

.NET 3.5并没有什么特别之处,它只是一堆添加的程序集(如Linq)。 .NET 3.0(如WPF)也是如此。 .NET frameworks 2.0到3.5 SP1仍然使用相同版本的CLR 2.0版。

因此,非常有意识地决定使您的程序依赖于.NET 3.5,它需要Project + Add Reference并选择具有3.5.0.0版本号的程序集。一旦这样做,您的客户端需要在她的机器上安装相同的程序集。这需要在她的机器上安装.NET 3.5版本的框架。

大多数客户已经拥有它,它由Windows Update分发。