私はDLLクラスライブラリを構築しています - できるだけ多くの人が使用できるようにしたいのですが。どのバージョンの.NET FrameworkとどのC#バージョンを使用する必要がありますか?異なるバージョンの下位互換性のあるDLLまたは異なるDLLを作成することは可能ですか?または、Windowsは自動的に.NETフレームワークを更新するので、最新バージョンを使用するだけですか?どんな指導にも感謝!クラスライブラリで対象とする.NET FrameworkとC#のバージョンを教えてください。
答えて
一部の製品では、複数のランタイムバージョン(.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記号を追加すると思います。
3.0または3.5の機能を使用する必要がない限り、2.0にしておきます。
個人的には、私は.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を使う人はいないだろうと思っています;-)
新しいプロジェクトを開始する場合、最新のランタイム! 3.5が利用可能な場合、新しいバージョンで深刻な問題があることが分かっていない限り、2.0または1.0でプロジェクトを開始する必要があるのはなぜですか?新しいバージョンは古いバグを修正し、新しい機能を追加してこれがうまくいくことを意味します。
古いプロジェクトを新しいバージョンにアップグレードする場合は、利益と損失を考慮する必要があります。その場合、古いバージョンに固執しない場合は、それをアップグレードし、
新しいツールは古いバージョンをサポートしていない可能性があるため、注意してください。これは2010年の場合ではありませんが、2.0までのすべてのバージョンをサポートします。
これを試してみてください:
スイッチ対象モードからフレームワーク2.0(削除システムを参照してください)。それがコンパイルされない場合linqbridge.dllへの参照を追加してみてくださいより
、:
ない場合は、3.5ターゲットとすべき;)私はエリックバンブラーケルの答えに投票
しかし、彼はサードパーティのDLLへの参照を追加する場合、彼はまたそれを解放する必要があります。その時点で、彼は.net3.0以上を使うべきです。 – Tony
linqbridgeは非常に小さく、適切です。私は.net 2.0で始まり、C#3の機能を楽しんでいる間にVS 2008でそれを引き続きターゲットにしています。 –
@トニー:あなたが必要とするものに依存すると思います; – kentaromiura
を。 また、私は
MyLibrary.DLL
MyLibrary.LINQ.dll
は、このように言って、あなたはLINQと拡張メソッドのような3.5の機能をサポートしたい場合、あなたは追加のライブラリを作成することを提案したいですMSと同じアプローチを使用していました(System.dll 2.0のバージョンを残して、すべての新機能をSystem.Core.dllに追加したとき)
私はバージョン2をターゲットにします。0にコア関数を含むライブラリを追加し、3.5をターゲットとする追加のライブラリを追加して、コアライブラリに基づく拡張メソッドを追加します。
いつもチャンスがある2人は同じ答えを書くでしょう:) –
広い範囲のユーザーが必要な場合は、以前のバージョンでそれを行う必要があります。
個人的にはこれは良い考えではありません。主に.net1.Xと.net2.0の間に多くの急な変更があるので – Tony
これは、DLLの目的によって異なります。他の人が利用できるようにする一般的なC#ロジックがあれば、.net 2.0がおそらく最適です。しかし、WPF、EF、WCF、Silverlightなどの.netの新しい機能と関係がある場合は、その特定の機能をサポートする.netのバージョンにする必要があります。
個人的には、.net1.0からのジャンプとは異なり、.net2.0から.net3.5へのジャンプを作成するのはかなり痛みがないので、 net2.0。 :)
もう誰も.Net 1.1を使用していないと思います。あなたが本当に3.5機能を使用しない限り、2.0はうまくいくはずです。また、実際にあなたのライブラリーを使用する人を管理している場合は、それもそれらに依存します。彼らが最新のフレームワークを持っていれば、それを使うことができます。
あなたは間違っています。まだ1.1に固執している人がいます。古いオペレーティングシステムをサポートする必要がある場合もあります。 –
ああ。 1.1も楽しいです。 –
Will Hughes氏が指摘したようなアプローチを組み合わせることで、アクセス可能な場合に新しい機能を使用したい場合は、アクティブな開発中に最新のフレームワークを使用します。リリース候補の作成を開始する準備ができたら、最低のフレームワークに設定し、問題が到着したら、フレームワークバージョンを着実にバンプアップし、#ifdefアプローチを使用して解決します。
このソリューションは非常にうまく動作します。私はちょうど独特の「プロジェクトプロパティ - >ビルド - >条件付きコンパイルシンボル」を持つ2つの異なるプロジェクトごとに設定し、このようなコードで使用:
#if NET_4
xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore;
#endif
#if NET_3_5
xmlReaderSettings.ProhibitDtd = false;
#endif
- 1. 対象.NETコアクラスライブラリ.NET Framework 4.6.2クラスライブラリ
- 2. 特定のアドインプロジェクトが対象とするMicrosoft Officeのバージョンを知る方法を教えてください。
- 3. 廃棄パターン:管理対象と管理対象を知る方法を教えてください。
- 4. UAP Ver 10アプリケーションをサポートするクラスライブラリで対象となる.Net Standardのバージョン
- 5. .NET Core 2 SDKツールを使用して.NET Framework 2.0を対象とするクラスライブラリを構築できますか?
- 6. CSRバージョンと証明書バージョンの違いを教えてください。
- 7. VistaとXPの違いを教えてください。[C]
- 8. Artifactoryでバージョンを作る方法を教えてください
- 9. は、私が働いているのVisual Studioプロジェクトは.NET Frameworkの4.6.2バージョンを対象としたバージョン4.6.2
- 10. どの.NET Frameworkのバージョンを同梱してください。 2,3、
- 11. C#のバージョンと.NET Frameworkのバージョン?
- 12. Internet Frameworkの.netフレームワークのバージョンと改訂を確認してください
- 13. C++と.NETの間で名前付きパイプを動作させる方法を教えてください。
- 14. SpringAMQP 1.7でサポートされているRabbitMQのバージョンを教えてください。
- 15. インストールしたモノトゥッチのバージョンを教えてください。
- 16. .NET Framework 4.5.2で使用するNewtonsoft.JSON(Json.NET)のnugetパッケージを特定する方法を教えてください。
- 17. ItemListenerでItemEvent.getStateChange()とcheckbox.getState()の違いを教えてください。
- 18. Entity Frameworkでプライマリキーが不足している場合の対処方法を教えてください。
- 19. 参照異なる.NET Frameworkを対象とするNugetパッケージ
- 20. .NET FrameworkとxUnitを使用して複数のフレームワークを対象とするユニットテストコード
- 21. NSISで以前のバージョンをアンインストールする方法を教えてください
- 22. 管理対象のDirectXプログラムをWindows 7に移行する方法を教えてください。
- 23. ElmとClojureScriptの違いを教えてください。
- 24. iPad 3GとWiFiの違いを教えてください
- 25. .Net Framework 4.62を対象とする.NETコアアプリケーションをAzureに展開する
- 26. .NET Framework - .NET Framework 4.6を対象とするときにXElementが見つかりませんでした
- 27. C#のユーザー名とパスワードの検証方法を教えてください。
- 28. Visual Studio 2017を以前の.NET Coreバージョンにダウングレードする方法を教えてください
- 29. 管理対象サーバ上のPhusion Passengerのバージョンを確認してください
- 30. .NETコアのパフォーマンスカウンタについて教えてください。 Windowsでは
あなたはどこから来ている私は理解しますが、このアプローチはいるようです遅い/新しいバージョンの.netの採用を停止します。 – Tony
@トニー - 私はそうは思わない。彼らは新しいものではなく有用であるため、新しいものを採用すべきです。 –