1. ホーム
  2. .net

[解決済み】'useLegacyV2RuntimeActivationPolicy'は、.NET 4 configで何をするのでしょうか?

2022-04-18 13:49:12

質問

SlimDXを使用し、アンマネージドコードを持つプロジェクトを.NET 4.0に変換する際に、以下のエラーが発生しました。

混合モードアセンブリはランタイムのバージョン 'v2.0.50727' に対してビルドされており、追加の構成情報なしに 4.0 ランタイムでロードすることはできません。

ググってみると、アプリケーションの設定にこれを追加することで解決しました。

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

質問なのですが useLegacyV2RuntimeActivationPolicy は何をしているのでしょうか?それに関するドキュメントが見当たりません。

どのように解決するのですか?

少し時間が経ってから(さらに検索して)、私は見つけました。 このブログのエントリー by Jomo Fisher.

最近見受けられた問題の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の読み込みに戻ります。