27

Visual Studio 2010 C / C ++ランタイムのリンクと展開ポリシーの変更について説明している公式ノート、kbの記事、またはその他のドキュメントはどこにありますか?

Visual Studio 2008(VC90ランタイムを使用)では、マニフェストがネイティブイメージに埋め込まれ、ランタイムライブラリがサイドバイサイドアセンブリ(WinSxS)として展開されました。これにより、VS 2008 SP1を使用してネイティブexeまたはライブラリを再構築するときに問題が発生し、埋め込みマニフェストにはC++ランタイムの更新バージョンが必要でした。

VS 2010およびMSVCR100ランタイムバージョンでは、ポリシーが完全に変更されたようです。

  1. ファイルmsvcr100.dllおよびその他のC/C ++ランタイムライブラリは、SxSアセンブリとしてインストールされなくなりました。
  2. VS2010でコンパイルする場合、実行時の「依存関係」エントリは埋め込みマニフェストに追加されません。つまり、実行時に任意のバージョンのmsvcr100.dllがロードされる可能性があります。
  3. .NET 4がインストールされているマシンでは、一致するランタイムの名前はmsvcr100_clr0400.dllであり、ネイティブコードでは読み込まれませんが、msvcr100.dllに名前が変更されたコピーは正常に機能します。これは、C / C ++コードを使用するプロセスには、常に同じC /C++ランタイムの2つのバージョンがロードされることを意味すると思います。

これはポリシーの重要な変更のようであり、VS 2008でのSxSの展開とマニフェストの依存関係から遡ります。変更された内容を誰かがもっと明らかにし、これらの変更を説明するドキュメント、Readme、またはブログ投稿を指摘できますか?動機と関連する影響?

この方法の方が優れていると思います-強力なバージョンマニフェストとSxSの展開は悪夢でした-しかし、VS2010でのこれらの予期しない一見文書化されていない変更に驚いています。

ボーナスの質問: VS2010でC++ / CLIライブラリをコンパイルして、msvcr100.dllではなくmsvcr100_clr0400.dllにリンクするにはどうすればよいですか?この考え方は、C ++ / CLIアセンブリは、.NET 4によってインストールされたもの以外の依存関係なしで(静的リンクなしで)実行する必要があるということです。

4

2 に答える 2

16

あなたはすでにほとんどの質問に答えました。CRTを並べて展開することは悪夢であり、多くのプログラマーが問題を抱えていました。マイクロソフトは、VS2010リリースに同意し、それをあきらめました。msvcr100.dllという名前のc:\ windows\system32のDLLに戻ります。そして、msvcp100.dll、vcomp100.dll、atl100.dll、mfc100.dll、mfcm100.dll、その他のランタイムサポートDLL。VS2003以前のエディションの場合と同じです。ここでも、DLL地獄の問題を解決するのはユーザーの負担です。その人はそうすることができる可能性が最も低いですが、彼らは支援のために支払う予算を持っている傾向があります。無料のウェブサイトから助けを得る必要があるプログラマーとは異なり:)

しかし、あなたは助けることができます、app-localデプロイメントが再び有効になりました、あなたはあなたのメインEXEと同じディレクトリにmsvcr100.dllをデプロイすることができます。これは以前のバージョンでは明示的にチェックされ、禁止されていました。App-localにはいくつかの優れた点があり、アプリを壊すような善意のあるが不幸な更新からあなたを隔離します。セキュリティホールを修正する更新をデプロイするのはあなた自身の責任ですが。それが不快な場合は、システムディレクトリのコピーを展開して信頼してください。

cLRで使用するためのプライベートコピーであるmsvr100_clr0400.dllにリンクしようとしないでください。msvcr.dllは、MicrosoftDLLで使用するためのプライベートコピーです。これらのDLLにリンクするために必要な.libファイルがありません。

于 2011-07-08T12:06:43.407 に答える
6

トピックに関するいくつかのリンク–誰かがそれらを役立つと思うことを願っています:

于 2012-03-02T08:35:41.910 に答える