2009-07-30 4 views
10

私はDLLクラスライブラリを構築しています - できるだけ多くの人が使用できるようにしたいのですが。どのバージョンの.NET FrameworkとどのC#バージョンを使用する必要がありますか?異なるバージョンの下位互換性のあるDLLまたは異なるDLLを作成することは可能ですか?または、Windowsは自動的に.NETフレームワークを更新するので、最新バージョンを使用するだけですか?どんな指導にも感謝!クラスライブラリで対象とする.NET FrameworkとC#のバージョンを教えてください。

答えて

10

一部の製品では、複数のランタイムバージョン(.NET 1.1、.NET 2.0、および.NET 3.5)を同時にターゲットにしています。

  • 別の溶液とプロジェクトファイルと.NET 1.1、2.0、および3.5 SP1のそれぞれに対して、同じソースファイルを参照:

    我々はいくつかの方法でこれを処理します。

例:

:私たちはこのようなプリプロセッサ命令を使用して、.NET Frameworkの特定のコードのためのソリューション

  • のそれぞれにおけるNET_X_Xシンボルを、定義

     
    \ProductFoo_1_1.sln (.NET 1.1 solution, VS 2003) 
    \ProductFoo_2_0.sln (.NET 2.0 solution, VS 2008) 
    \ProductFoo_3_5.sln (.NET 3.5 solution, VS 2008) 
    
    \FooLibrary\FooLibrary_1_1.csproj (.NET 1.1 Project, VS 2003) 
    \FooLibrary\FooLibrary_2_0.csproj (.NET 2.0 Project, VS 2008) 
    \FooLibrary\FooLibrary_3_5.csproj (.NET 3.5 Project, VS 2008) 
    
    \FooLibrary\FooClass.cs (shared amongst all Projects) 
    \FooLibrary\FooHelpers_1_1.cs (only referenced by the .NET 1.1 project) 
    
    \FooService\FooService_3.5.csproj (.NET 3.5 Project, VS 2008) 
    \FooService\FooService.cs 
    
    •  
      public void SomeMethod(int param) 
      { 
      #ifdef NET_1_1 
      // Need to use Helper to Get Foo under .NET 1.1 
          Foo foo = Helper.GetFooByParam(param); 
      #elseif NET_2_0 || NET_3_5 
      // .NET 2.0 and above can use preferred method. 
          var foo = new Foo { Prop = param }; 
          foo.LoadByParam(); 
      #endif 
          foo.Bar(); 
      } 
      
      #ifdef NET_3_5 
      // A method that is only available under .NET 3.5 
      public int[] GetWithFilter(Func Filter) 
      { 
          // some code here 
      } 
      #endif 
      

      説明のため、#で始まる上記の行はプリプロセッサコマンドです。ソリューションをコンパイルすると、C#コンパイラ(csc)はソースファイルを前処理します。 #ifdefステートメントがある場合、cscはそのシンボルが定義されているかどうかを判断し、そうであればプロジェクトをコンパイルするときにそのセグメント内の行を含めます。

      これは、特定の条件でコンパイルするためのコードをマークアップする方法です - 私たちはまた、構築し、特定の詳細なデバッグでより集中的なデバッグ情報を含めるためにそれを使用するので、同じよう:

       
      #if DEBUG_VERBOSE 
          Logging.Log("Web service Called with parameters: param = " + param); 
          Logging.Log("Web service Response: " + response); 
          Logging.Log("Current Cache Size (bytes): " + cache.TotalBytes); 
          // etc. 
      #endif 
      
      • 私たちは、その後、NAntのスクリプトを持っています.NETバージョンごとのリリースの制作を自動化します。 私たちはTeamCityを通してこれをすべて制御しますが、NAntスクリプトも手動で起動できます。

      これは、従来の.NET 1.1または2.0インスタンス(たとえば、顧客がアップグレードできない/アップグレードしない場合など)を維持する必要がある場合にのみ行うようになります。

      私は、.NET 4.0が登場したときに同じことを行い、NET_4_0記号を追加すると思います。

  • 9

    3.0または3.5の機能を使用する必要がない限り、2.0にしておきます。

    +2

    あなたはどこから来ている私は理解しますが、このアプローチはいるようです遅い/新しいバージョンの.netの採用を停止します。 – Tony

    +5

    @トニー - 私はそうは思わない。彼らは新しいものではなく有用であるため、新しいものを採用すべきです。 –

    11

    個人的には、私は.NET 2.0をターゲットにしています。これは、とりわけ、意味:

    • ません拡張メソッド(回避策ががあります)
    • んLINQ

    • あなたは、ラムダが

    • は、あなたが 'VAR' を使用できる式使用することができます

      キーワード

    問題は、C#3.xの言語機能(いわゆる構文的な砂糖)を使用できますが、t arget C#3.x(System.Coreに名前を1つ付け、拡張メソッドとlinqを含む)

    私はC#1.xをサポートしようとはしません。C#2.x以降とはかなり異なっています。また、あなたのライブラリを使用する人は、新しいものを構築する人、C#1.xを使う人はいないだろうと思っています;-)

    2

    新しいプロジェクトを開始する場合、最新のランタイム! 3.5が利用可能な場合、新しいバージョンで深刻な問題があることが分かっていない限り、2.0または1.0でプロジェクトを開始する必要があるのはなぜですか?新しいバージョンは古いバグを修正し、新しい機能を追加してこれがうまくいくことを意味します。

    古いプロジェクトを新しいバージョンにアップグレードする場合は、利益と損失を考慮する必要があります。その場合、古いバージョンに固執しない場合は、それをアップグレードし、

    新しいツールは古いバージョンをサポートしていない可能性があるため、注意してください。これは2010年の場合ではありませんが、2.0までのすべてのバージョンをサポートします。

    4

    これを試してみてください:

    スイッチ対象モードからフレームワーク2.0(削除システムを参照してください)。それがコンパイルされない場合linqbridge.dllへの参照を追加してみてくださいより

    、:

    ない場合は、3.5ターゲットとすべき;)私はエリックバンブラーケルの答えに投票

    +0

    しかし、彼はサードパーティのDLLへの参照を追加する場合、彼はまたそれを解放する必要があります。その時点で、彼は.net3.0以上を使うべきです。 – Tony

    +0

    linqbridgeは非常に小さく、適切です。私は.net 2.0で始まり、C#3の機能を楽しんでいる間にVS 2008でそれを引き続きターゲットにしています。 –

    +0

    @トニー:あなたが必要とするものに依存すると思います; – kentaromiura

    0

    を。 また、私は

    MyLibrary.DLL

    MyLibrary.LINQ.dll

    は、このように言って、あなたはLINQと拡張メソッドのような3.5の機能をサポートしたい場合、あなたは追加のライブラリを作成することを提案したいですMSと同じアプローチを使用していました(System.dll 2.0のバージョンを残して、すべての新機能をSystem.Core.dllに追加したとき)

    0

    私はバージョン2をターゲットにします。0にコア関数を含むライブラリを追加し、3.5をターゲットとする追加のライブラリを追加して、コアライブラリに基づく拡張メソッドを追加します。

    +0

    いつもチャンスがある2人は同じ答えを書くでしょう:) –

    0

    広い範囲のユーザーが必要な場合は、以前のバージョンでそれを行う必要があります。

    +0

    個人的にはこれは良い考えではありません。主に.net1.Xと.net2.0の間に多くの急な変更があるので – Tony

    0

    これは、DLLの目的によって異なります。他の人が利用できるようにする一般的なC#ロジックがあれば、.net 2.0がおそらく最適です。しかし、WPF、EF、WCF、Silverlightなどの.netの新しい機能と関係がある場合は、その特定の機能をサポートする.netのバージョンにする必要があります。

    個人的には、.net1.0からのジャンプとは異なり、.net2.0から.net3.5へのジャンプを作成するのはかなり痛みがないので、 net2.0。 :)

    0

    もう誰も.Net 1.1を使用していないと思います。あなたが本当に3.5機能を使用しない限り、2.0はうまくいくはずです。また、実際にあなたのライブラリーを使用する人を管理している場合は、それもそれらに依存します。彼らが最新のフレームワークを持っていれば、それを使うことができます。

    +0

    あなたは間違っています。まだ1.1に固執している人がいます。古いオペレーティングシステムをサポートする必要がある場合もあります。 –

    +0

    ああ。 1.1も楽しいです。 –

    0

    Will Hughes氏が指摘したようなアプローチを組み合わせることで、アクセス可能な場合に新しい機能を使用したい場合は、アクティブな開発中に最新のフレームワークを使用します。リリース候補の作成を開始する準備ができたら、最低のフレームワークに設定し、問題が到着したら、フレームワークバージョンを着実にバンプアップし、#ifdefアプローチを使用して解決します。

    0

    このソリューションは非常にうまく動作します。私はちょうど独特の「プロジェクトプロパティ - >ビルド - >条件付きコンパイルシンボル」を持つ2つの異なるプロジェクトごとに設定し、このようなコードで使用:

    #if NET_4 
          xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore; 
    #endif 
    #if NET_3_5 
          xmlReaderSettings.ProhibitDtd = false;     
    #endif 
    
    関連する問題