2

CLR2(.Net 3.5)でコンパイルされたC#で作成されたCOMライブラリが、CLR4(.Net 4)のみで使用された場合に機能しない理由を誰かが知っていますか?CLR2 for COMにあるCLR4には何が欠けていますか?

app.configで適切なスタートアップを使用して、C#をCLR4 /.Net4で実行します。

<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

COMインターフェイスを作成しようとするまで、C#のものはすべて機能します。次の例外がありました。

ランタイムのロードに失敗しました。(HRESULTからの例外:0x80131700)

C ++からCOMインターフェイスを作成しようとすると、同じ問題が発生します。

CLR2(.Net 3.5)をインストールすると、すべてのCOMが機能し始めます。何が起こっているのか知りたいのですが。

4

3 に答える 3

3

アセンブリはCLRv2を必要とするように登録されていますが、そのバージョンを.configファイルでロードすることを明示的に禁止しました。.configファイルに、「わかっていますが、大丈夫です」と言うための追加のビットが必要になります。このような:

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

.NET 4で追加されたインプロセスのサイドバイサイドバージョン管理機能を意図的にバイパスしていることに注意してください。アプリケーションが複数のバージョンのCLRをロードして、異なるCOMサーバーをサポートできるようにするために明示的に追加された新機能CLRバージョン要件。これは確かにあなたのシナリオのように聞こえます。この場合、より互換性のあるネズミ捕りは、CLRの両方のバージョンをロードできるようにすることです。

<startup>
   <supportedRuntime version="v4.0"/>
   <supportedRuntime version="v2.0.50727"/>
</startup>  

もう1つの非常に重要な詳細は、この.configファイルの名前と場所です。直感的ではありませんが、CLRはスタートアップEXEのディレクトリと名前から.configファイルを見つけます。したがって、この[ComVisible]サーバーをネイティブC ++プログラム(c:\ foo \ bar.exeなど)からテストする場合は、ファイルに「bar.exe.config」という名前を付けて、c:\fooディレクトリにコピーする必要があります。.configファイルをDLLと同じディレクトリにDLLの名前で配置しても機能しません

于 2012-11-05T18:14:57.717 に答える
3

.NET 4でアセンブリをコンパイルした後、おそらくregasm.exeを使用してRuntimeVersionを更新する必要があります。再コンパイルがオプションでない場合は、レジストリのRuntimeVersionをv2.0.50727からv4.0.30319に変更する可能性があります。これは私のために働いた。私はここで同様の答えを見つけました:.NET-4のみのシステムのGACで.NET-2.0をターゲットにしたCOMDLLを使用する

于 2012-11-05T19:06:41.163 に答える
0

CLRバージョンは.dllファイルヘッダーに書き込まれ、その値はregasmツールによってレジストリにコピーされます。次に、アクティベーターは、指定された正確なCLRバージョンでコンポーネントを実行しようとします。CLR4でCLR2アセンブリに実装されたコンポーネントを実行するには、登録情報(Classes / {clsid} / InprocServer32 / component-version / RuntimeVersion)を手動で変更するかuseLegacyV2RuntimeActivationPolicy、前の回答で説明したように設定します(構成ファイルは実際にネイティブの.exeの横に移動しますが、問題はありません)。

于 2012-11-05T19:13:32.713 に答える