2010-01-14 2 views
1

Я хотел бы иметь возможность использовать типы .NET 3.5 в приложении на основе .NET 2.0. В основном у нас нет развернутых библиотек .NET 3.5 на рабочих столах, но нам нужно использовать некоторые классы. Любые идеи, как это возможно?Использование .NET 3.5 в .NET 2.0

Спасибо, Marios

+1

Пока вы не используете возможности .NET 3.5, вы можете скомпилировать его как .NET 2.0. – ChaosPandion

+0

Точный дубликат: http://stackoverflow.com/questions/814085/using-net-framework-3-5-features-in-net-framework-2-0/ –

ответ

2

Этот вопрос заставлял меня задаваться вопросом, поэтому я немного впился в него.

Ответ на ваш вопрос зависит от того, сколько зависимостей у вас есть на новых фреймворках и сколько взлома вы готовы делать.

Настоящий Лучший ответ - укусить пулю и установить необходимый каркас. Однако, если вам нужно просто распространять одну сборку из .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 Изменение копия локального свойство в списке ссылок сборки к истине.

Hack # 3 (Ugliest hack) Измените конфигурацию машины, чтобы добавить раздел конфигурации для необходимой сборки. Это может потребоваться или не понадобиться, в зависимости от сборки, в которую вы втягиваете. В своем тесте я ссылался на сборку System.Runtime.Serialization и должен был скопировать этот раздел с machine.config на моем компьютере 3.5 на мой компьютер 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 Runtime 3.5 на компьютере, если вы хотите запустить .NET 3.5-код. Вам нужно будет создавать проекты, которые не полагаются на 3.5, если вы развертываете на машине с 2.0.

Ниже приведена информация о том, как создавать проекты, предназначенные для .NET 2.0, с VS2008.

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

+0

Я слышал о способе извлечения ИЛ из 3.5 классов и регенерировать код C#. Не уверен, что это правда. – koumides

+0

Это звучит намного сложнее, чем работать с отсутствующей функциональностью на .NET 2.0. Это LINQ, что вы хотите, случайно? В этом случае вы ввернуты. Тем не менее, было бы легче заменить его чем-то другим, чем взломать IL (если это вообще возможно). –

+0

Linq может использоваться при развертывании в .NET 2.0 (SP1). Есть несколько возможностей сделать это, вы можете, например, используйте LinqBridge (http://www.albahari.com/nutshell/linqbridge.aspx) или подход, описанный в http://linqinaction.net/blogs/main/archive/2007/09/05/linq-support-on- net-2.0.aspx –

2

Какие типы вы хотите использовать? Теоретически теоретически возможно использовать определенные типы, поскольку сборки .NET 3.5 скомпилированы для среды выполнения .NET 2.0. Тем не менее, имейте в виду, что, как правило, сборки .NET 3.5 потребуют установки .NET 3.5 Framework, поскольку в .NET 3.5 больше, чем просто сборки (например, сервисы для WPF и т. Д.).

Если вы не хотите развернуть платформу .NET 3.5 с вашим приложением, я предлагаю вам ознакомиться с профилем .NET 3.5 Client, уменьшенным вариантом, который будет достаточным для большинства настольных приложений.

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.

+0

«Это всего лишь куча сборок»: Конечно, есть много новых сборок (и время выполнения одинаково), но не забывайте, что могут быть дополнительные ключи реестра, COM или собственные зависимости или службы, например PresentationFontCache для установки. –