2010-01-14 2 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

+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에 대한 참조를 추가

해킹 # 1 :

는 여기에 2.0에서 3.0 일에서 어셈블리를 만들기 위해했던 해킹입니다. Visual Studio에서 불평해야합니다. 프로젝트를 언로드하고 프로젝트 파일을 편집하십시오. xml에서이 줄을 제거하고 프로젝트를 다시로드하십시오.

<RequiredTargetFramework>3.0</RequiredTargetFramework> 

Visual Studio는이 어셈블리를 사용해 행복하게 컴파일하고 실행할 것입니다.

해킹 # 2 변경 true로 어셈블리 참조 목록에서 로컬 복사 속성입니다.

해킹 # 3 (Ugliest hack) 필수 어셈블리에 대한 구성 섹션을 추가하려면 컴퓨터 구성을 수정하십시오. 이 수도 또는 가져올 어셈블리에 따라 필요하지 않을 수도 있습니다. 내 테스트에서 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 런타임 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

+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 어셈블리에는 어셈블리 (예 : WPF 용 서비스 등)보다 .NET 3.5에 더 많은 .NET Framework가 설치되어야합니다.

응용 프로그램과 함께 .NET 3.5 프레임 워크를 배포하지 않으려는 경우 .NET 3.5 클라이언트 프로필 (대부분의 데스크톱 응용 프로그램에 충분할 것임)을 살펴 보시기 바랍니다.

1

.NET 3.5에는 특별한 것이 없습니다. Linq와 같은 추가 된 어셈블리 일뿐입니다. WPF와 같은 .NET 3.0과 동일합니다. .NET Framework 2.0 ~ 3.5 SP1은 여전히 ​​동일한 버전의 CLR 버전 2.0을 사용합니다.

.NET 3.5에 의존하는 프로그램을 만드는 것은 매우 의식적인 결정이므로 Project + 참조 추가 및 버전 번호가 3.5.0.0 인 어셈블리를 선택해야합니다. 일단 그렇게하면 클라이언트는 컴퓨터에 동일한 어셈블리를 설치해야합니다. 그녀의 컴퓨터에 .NET 3.5 버전의 프레임 워크를 설치해야합니다.

대부분의 클라이언트는 이미 Windows Update에서 배포했습니다.

+0

"단지 많은 어셈블리입니다."물론 새로운 어셈블리가 많으며 런타임은 동일하지만 추가적인 레지스트리 키, COM 또는 네이티브 종속성 또는 PresentationFontCache와 같은 서비스가 필요할 수도 있음을 잊지 마십시오. 설정 될 수 있습니다. –