1

VC80.CRT バージョン 8.0.50727.762 に対してビルドおよびテストされた VC++ マネージド アプリがあります。埋め込まれたマニフェストが 762 を指していることを確認し、ビルド マシンには最新の VC80.CRT バージョンとして 762 が含まれています。

アプリは、762 とそれ以降のバージョンのランタイム (4053) の両方を備えたマシンでも実行されています。

ちなみに、どちらのマシンも XP Pro SP2 です。2 台目のマシン (いわば 4053) には .NET 3.0 が搭載されています。

アプリは 4053 マシンで動作します。SxS の下の VC80.CRT に付随するパブリッシャー ポリシーにより、アプリはアプリケーションに対して 762 ではなく 4053 をロードすることを理解していると思います。

入りたくないさまざまな理由から、762 バージョンを使用するよう強制しようとしてきましたが、これまでのところ成功していません。

いずれにせよ、文献を調べた結果、ロードするターゲット バージョンを決定するチェーン (アプリ構成 -> 発行者ポリシー -> マシン構成) を理解していると思います。

そこで、myapp.exe.config ファイル (以下を参照) を myapp.exe の近くに配置することにしました。チェーンの 2 番目のステップを回避するために、publisherPolicy を「no」に設定することに注意してください。

アプリはまだ 762 ではなく 4053 をロードします。おそらく、マシン構成ファイルの内容が原因ですが、そのファイルの内容が何を意味するのかを理解することさえできません。確かに VC80 への参照はありません。 .CRT またはそこにある msvc[x]80.dll ライブラリのいずれか。

アセンブリの古いバージョンを参照することは比較的簡単で、「dll 地獄」を克服するための鍵になると予想していました。アセンブリの発行者が下位互換性を (発行者のポリシーを介して) 保証したいと思っていたとしてもです。
誰でも光を当てることができますか?ありがとう

<configuration>
    <runtime>    
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b">
                 </assemblyIdentity>
                 <publisherPolicy apply="no" />
                 <bindingRedirect oldVersion="*" newVersion="8.0.50727.762"/>
             </dependentAssembly>
         </assemblyBinding>
   </runtime>
</configuration>
4

2 に答える 2

1

Machine.config は .NET アプリ用です。ネイティブ SxS 構成はWinSxS ディレクトリにあります。

EXE にマニフェストが埋め込まれていますか? XP SP2 以降 (私が思うに)、これらは外部 (foo.exe.manifest) ファイルよりも優先されます。

于 2010-03-01T14:10:11.520 に答える
1

この<runtime>タグは、CLR 依存関係用です。<windows>ネイティブ SxS に使用します。また、SxS 用のマシン構成はないと思います。GAC/CLR 用のみです。

関連する質問に対する私の回答を参照してください: ネイティブ アプリケーションに古い C ランタイムの使用を強制するにはどうすればよいですか?

于 2010-06-29T20:33:03.957 に答える