3

次のように、いくつかの異なるアプリケーションの .config ファイルを変更しました。

<startup useLegacyV2RuntimeActivationPolicy="true">
   <supportedRuntime version="v4.0"/>
</startup>  

devenv.exe.config (VS 2005 - 聞かないでください :)) に対してこれを行ったとき、うまく機能しました - ほとんどの Visual Studio は .NET 2.0 を使用していましたが、.NET 4.0 フレームワークをターゲットとするアセンブリを利用することができました.

カスタム .exe に対して同じことを試みました。これはたまたま MS CAB に基づいており (わずかに変更されています)、WPF と WinForms コンテンツのハイブリッド ミックスを持っています。このアプリケーションのアプリ構成ファイルを変更するとすぐに、アプリケーションの起動中に次の例外が発生し始めました。

元に戻す操作で、対応するセット操作で適用されたものとは異なるコンテキストが検出されました。考えられる原因は、コンテキストがスレッドで設定され、元に戻されていない (元に戻されていない) ことです。System.InvalidOperationException: Undo 操作で、対応する Set 操作で適用されたものとは異なるコンテキストが検出されました。考えられる原因は、コンテキストがスレッドで設定され、元に戻されていない (元に戻されていない) ことです。

アプリケーション コードに直接何も表示されない、非常に長いスタック トレースがあります (多数の MS アセンブリのみ)。

アプリケーションの .config ファイルを次のように変更すると:

<startup useLegacyV2RuntimeActivationPolicy="true">
</startup>

つまり、supportedRuntime 要素を削除すると、アプリケーションはこの例外をスローしません。しかし、コード内で .NET 4 アセンブリを読み込もうとすると、次のように失敗した場合:

System.BadImageFormatException: ファイルまたはアセンブリ '' またはその依存関係の 1 つを読み込めませんでした。このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。

これは期待できると思います。

2 つの質問があります。

1) このアプリケーションの構成ファイルを変更して supportedRuntime 要素を含め、.NET 4 サポートを追加し、それについて何ができるかについての提案を追加すると、System.InvalidOperationException 例外が発生する理由はわかりますか?

2)答えが「理由がわからない/それについて何ができるかわからない」である場合、.NET 3.5 SP1コード(C#)は、条件付きで.NET 4ランタイムサポートを追加するためのよりきめ細かいサポートを提供できますアプリケーション全体をターゲット .NET 4 に変換せずに、または宣言的な構成ファイルのアプローチを使用せずに、特定のアセンブリに対して? ある時点で、アプリケーション全体を .NET 4 をターゲットとするように変換しますが、短期的にはこれは困難な作業であり、短期的なソリューション/ハックを期待しています。

どんなアドバイスでも構いませんのでよろしくお願いします!

4

1 に答える 1

4

VS2005 でどのような動作が見られるのか正確にはわかりませんが、「ほとんどの Visual Studio は .NET 2.0 を使用していましたが、.NET 4.0 フレームワークをターゲットとするアセンブリを利用できた」というわけではありません。 . その構成により、プロセス内のすべてが v4 で実行されるようになります。そうでない場合は、バグである可能性が高いため、それについて知りたいと思います。(ところで、VS2005 を v4 に移行することで、サポートされているシナリオの範囲外であることに気付いたと思います。)

無効な操作の例外に関しては、フレームワーク間で何らかの非互換性が発生していると思います。私たちはそれについてもバグを取りたいと思っています。例外時のスタック トレースを共有できますか?

インクリメンタル アップグレード アプローチを採用する限り、良い答えはありません。CLR は COM コンポーネントのインプロセス SxS アクティベーションを自動的にサポートするため、モジュールを COM コンポーネントとして抽出できる方法でアプリが実装されている場合は、それを活用できます。問題は、ほとんどのアプリがこのように記述されていないことです。すべてを v4 にアップグレードするだけで、アプリを再構築するよりも作業が少なくなります。

個々のアセンブリの読み込みは、読み込みをトリガーしたランタイムで発生します。通常のアセンブリ ロードのインプロセス SxS アクティベーションはありません。

于 2010-03-30T17:44:46.690 に答える