visual-studio-VS2017およびVS2015アプリとdllの間の公式のバイナリ非互換性は正確ですか?

TL; DR-MSのドキュメントでは、VS2015とVS2017のライブラリ間のバイナリ互換性は一方向ですが、必然的に双方向であると想定していました。キャッチはどこですか?

まず、背景について:

> MSVCビルドライブラリは、VS2015とVS2017の間でofficially binary compatibleです。
>具体的には、2017年のMSVCRT140バージョンでVS2015 Cアプリを使用できます。(VCRedist backwards compat
> official documentation siteは、混乱を招く制限を示しています。

背景/関連する質問:

> Is Visual-C++-2017 binary compatible with VC++-2015?
> Questions about “Binary Compatibility between Visual Studio 2015 and Visual Studio 2017”
> Binary compatibility between VS2017 and VS2015

私が見つけた紛らわしい制限は:

There are two exceptions to this rule. Binary compatibility is not guaranteed in these cases:

When consuming libraries built with a toolset whose version is greater than the toolset used to compile and link the application. For example, a program that is compiled and linked with compiler version 19.12 can consume libraries that are compiled with 19.0 up through 19.12.

この警告は、私見では、技術的にずさんでわかりにくいものです。その技術的な理由は何ですか?

実行可能ファイルとDLLの間のインターフェイスはかなり複雑であるため、不完全だからだと言いますが、この箇条書きは「アプリケーション」のみを対象としています。

具体的には、すべてのモジュールが動的CRTバージョンに対して構築され、この動的CRTバージョンが利用可能な最新バージョンであると仮定すると、バイナリ互換が問題となる次の組み合わせが表示されます。

> my_2017.exe<-> my_2015.dll-一見サポートされている
> my_2015.exe<-> my_2017.dll–サポートされていないようです
> my_2017.exe<-> my_2015.dll<-> my_2017_x.dll-これでサポートされるbtw DLLの「方向」は何ですか?

バイナリ互換-純粋にバイナリ/インターフェースの観点から-は両方の方法で実行する必要があるため、ここで突然非互換性を取得できる場所はわかりません。API呼び出しは双方向(コールバックなど)になり、オブジェクトは双方向に「移動」します、DLLのロード順序も混在させることができます。

これは重要なポイントです。これは、前述のバイナリ互換性が厳しく制限されていることを意味します。

>アプリケーションがVC14 *コンパイル済みライブラリを使用する場合、「公式に」アプリケーションが「最新バージョン」でビルドされていることを確認する必要があります。
>一方、「アプリケーション」をビルドせず、DLLを持っている場合、他のVC14 * DLLを消費して互換性があるように見えますか?
> VCRedistには、サポートされていないように見えるケースがあります。つまり、2015アプリからVC2017ライブラリ(この場合はCRT)を使用できます。

質問

そのため、why(!)はこれが制限されており、dll間の依存関係や、inverted(!)CRT-dllバージョンの要件とどのように関係していますか。

ベストアンサー
マイクロソフトはドキュメントを更新しており、現在のバージョンのhttps://docs.microsoft.com/en-us/cpp/porting/binary-compat-2015-2017の関連セクションは次のとおりです。

C++ Binary Compatibility between Visual Studio 2015 and Visual Studio 2019

When you mix binaries built with different supported versions of the MSVC toolset,
the Visual C++ redistributable that your application runs on cannot be older
than any of the toolset versions used
to build your app or any libraries it consumes.

差分はhttps://github.com/MicrosoftDocs/cpp-docs/commit/a505dccfb31eb49c2ffece4dabd24a0a61b1fcb3#diff-d488b4c71be450b2a39cdce495c229bfにあります

これには直接のGitHub / MS-Docsの問題はありませんが、この制限はもっと意味があります:再配布可能なものの互換性要件について話しているだけで、少なくとも最新のモジュールと同じくらいのVCランタイムバージョンが必要ですつかいます。

これは、当然のことですが、これは単なるバイナリ互換性ではないためです。

もちろん、質問で私が言ったことはまだ有効です:(古い)VS2015アプリケーションは(新しい)VS2019再配布可能と互換性がある必要があるため、VCRedist-VC14.0がこれまでに公開したすべてのインターフェイスサーフェスはバイナリ互換である必要があります。

転載記事の出典を記入してください: visual-studio-VS2017およびVS2015アプリとdllの間の公式のバイナリ非互換性は正確ですか? - コードログ