.NET 4構成で「useLegacyV2RuntimeActivationPolicy」は何をしますか?
-
05-07-2019 - |
質問
SlimDXを使用し、したがってアンマネージコードを含むプロジェクトを.NET 4.0に変換しているときに、次のエラーが発生しました。
混合モードアセンブリは、ランタイムのバージョン 'v2.0.50727'に対してビルドされ、追加の構成情報がないと4.0ランタイムにロードできません。
グーグルで解決したのは、これをアプリケーション構成に追加することです:
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0"/>
</startup>
</configuration>
私の質問は、 useLegacyV2RuntimeActivationPolicy
は何をしているのですか?私はそれに関するドキュメントを見つけることができません。
解決
しばらくして(さらに検索して)このブログエントリ(ジョモフィッシャー)
最近見た問題の1つは、サイドバイサイドランタイムのサポートにより、.NET 4.0が古い混合モードアセンブリにバインドする方法を変更したことです。これらのアセンブリは、たとえば、C ++ \ CLIからコンパイルされたアセンブリです。現在利用可能なDirectXアセンブリは混合モードです。このようなメッセージが表示された場合は、問題が発生していることがわかります。
混合モードアセンブリは、ランタイムのバージョン 'v1.1.4322'に対してビルドされ、追加の構成情報がないと4.0ランタイムにロードできません。
[Snip]
アプリケーションの良いニュースは、次のようにapp.configフラグを設定することにより、これらのアセンブリの.NET 2.0時代のバインディングにフォールバックするオプションがあることです:
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup>
したがって、ランタイムが混合モードアセンブリを読み込む方法が変更されたように見えます。この変更に関する詳細、または変更が行われた理由が見つかりません。ただし、 useLegacyV2RuntimeActivationPolicy
属性はCLR 2.0の読み込みに戻ります。
他のヒント
この属性に関する情報の無効化を支援するために最近書いた説明です。 http://www.marklio.com/marklio/PermaLink,guid,ecc34c3c-be44-4422-86b7-900900e451f9.aspx (インターネットアーカイブウェイバックマシンリンク)
最も関連性の高いビットを引用するには:
[。NETのインストール] v4は&#8220; non-impactful&#8221;です。インストール時に既存のコンポーネントの動作を変更しないでください。
useLegacyV2RuntimeActivationPolicy属性を使用すると、基本的に&#8220;レガシーshim APIに依存していると言うことができます。選択したランタイムに関して、以前と同じように動作するようにしてください。&#8221;
なぜこれをデフォルトの動作にしないのですか?この動作はより互換性があり、以前のバージョンからのコードの移植がはるかに簡単になると主張するかもしれません。思い出すと、これはv4のインストールに影響を与え、マシンにインストールされている既存のアプリを破壊する可能性があるため、デフォルトの動作にはなりません。
完全な投稿でこれについて詳しく説明しています。 RTMでは、これに関するMSDNドキュメントの方が優れているはずです。