みなさん、
C#でコーディングを始めて以来、これは私を混乱させました。私の目標は、ユーザーが持っている最新の.NETフレームワークで実行できるアセンブリを作成することです。 .NET 4をインストールする必要はありませんが、ユーザーがそれを持っている場合はそれを使用します。さらに重要なのは、ユーザーがonly .NETを持っている場合でも引き続き機能させたいです。 4以下。これは不可能だと私は疑い始めています。
Visual Studioで "ターゲットフレームワーク"を変更するときに何を選択しているのか本当にわかりません。 「このバージョン以降と互換性がある」という意味ですか?または「このバージョンのみと互換性がありますか?」今のところ後者のようです。仮想マシンでのテストでは、.NET 4なしで.NET 4ターゲットアセンブリが失敗し、.NET 3.5なしで.NET 3.5ターゲットアセンブリが失敗することが示されています。これを設定する方法はないので、最大限の互換性を実現できますか?
更新:明確にするために、私は.NET 2をターゲットとするプログラムを持っています。ここのポスターは、.NET 4でロードする必要があることを示しているようですが、.NET 4のみがあり、それ以外は何もない環境では、ロードに失敗します。
UPDATE2:わかりました、理解しましたが、ここのポスターが考えるよりもはるかに複雑です。複雑さを説明するために別の質問を開いていますが、短いバージョンでは、.NET 4以外で.NET 4以外のアセンブリを実行するには、<supportedRuntime version="v4.0" />
を含むapp.configが必要です。それなしでロードしないでください。
フレームワークは下位互換性を持つように設計されています。 .NET 2.0で記述されたプログラムがある場合、4.0ランタイムで実行できます。これは、どのフレームワークも以前のバージョンが持っていた機能を削除しないためです(これが、ArrayListのような非ジェネリックコレクションであっても、それらは一般的なコレクションのために廃止されました)。ただし、その逆は必ずしも当てはまりません。以前のバージョンでは利用できなかった新しいランタイムの新機能を利用できるため、4.0アプリは2.0での実行が保証されていません。いずれの場合でも、アプリが特に対象としないランタイムバージョンでの実行を試行するようにしたい場合は、SupportedRuntime要素を使用してapp.configでそれを指定する必要があります。
特定の質問に答えるために、次の基本的な手順でやりたいことができます。
サポートするEARLIESTフレームワークバージョンを対象とするアプリを開発します。これにより、新しいランタイムの新しい機能(3.5のLinqや4.0の動的型付けなど)へのアクセスが無効になり、サポートされているどのランタイムからも提供できない機能がアプリに必要なくなります。
App.configファイルのSupportedRuntime要素を使用して、アプリケーションに受け入れられるフレームワークを指定します。これにより、アプリが実行されるランタイムを初期化するネイティブコードに、対象のバージョンが見つからない場合は他のコードを使用できることが通知されます。動作は最初にターゲットフレームワークを探すことであり、利用できない場合は、サポートされている最新のランタイムを使用する必要があると思います。
.NETは下位互換性があります。つまり、.NET Framework 2.0をターゲットフレームワークとして選択すると、インストールされているバージョン2.0、3.0、3.5、4.0で実行されます。ただし、たとえばターゲットフレームワークとしてバージョン4.0を選択した場合、バージョン4.0がインストールされている場合にのみ実行されます。
I believeこれは、選択したバージョン以降のバージョンになるはずです。したがって、2.0フレームワークを対象とする場合、クライアントに2.0、3.0、3.5、または4.0フレームワークがインストールされていれば機能します。
これを選択するときに言語機能も選択しているため、2.0フレームワークをターゲットとするアプリケーションを使用して4.0フレームワーク機能を使用できる方法はないと思います。動的に読み込まれるアセンブリでも機能しない場合は、2.0アプリケーションから4.0にコンパイルされたdllを読み込んでみてください。
ターゲティングの仕組みは次のとおりです。NET3.5をターゲティングする場合、ユーザーが.NET 3.5を持っていない場合、ターゲティングは実行されません。ユーザーがより高いバージョンを持っている場合に実行されます。
互換性を最大にするには、.NET 2.0を選択します。これは、.NET 3.5、4.0などでも実行できます。
ただし、LINQなどの.NETの新機能を失う可能性があります。
http://msdn.Microsoft.com/en-us/library/bb398197(VS.100).aspx