1

Visual Studio2008ExpressでC++を使用しています。

バイナリのみのWindowsライブラリをクライアントに提供しています。クライアント自体は他の多くのライブラリを使用しています。そのため、使用するdllファイルと一緒に両方のdllファイルを出荷しました。ここで問題となるのは、クライアントが、私たちも使用しているライブラリの一部を、別のバージョンで使用していることです。したがって、私たちが依存しているライブラリには互換性がないため、彼は私たちのライブラリを使用できません。

技術的には、両方の依存関係バージョンがプロセススペースにロードされる可能性があると思います。ただし、アプリケーションとdllの両方が同じ依存関係dllファイル名を探すため、これを行う方法がわかりません。誰かがこの問題に対処するための最良/最もクリーンな方法を教えてもらえますか?

ありがとう!

4

2 に答える 2

0

この種の問題は、提供する(新しい)追加のDLLを使用して解決できます。これにより、バージョンの競合(実行時)の処理が処理されます。これは、アプリとその依存関係の間の一種のプロキシです。

別の方法は、Windows転送ライブラリメカニズムを使用することです。

フォワーダーは、あるDLLから別のDLLに移動する機能に対応するための便利な方法です。

.defモジュール定義( )ファイルや#pragma:など、フォワーダーを宣言する方法はいくつかあります。

#pragma comment(linker, "/export:function=otherdll.function")
于 2012-05-25T12:57:46.647 に答える
0

一般的に言って、それは機能しません。これは、サードパーティのDLLバージョンがメモリにロードされるときに互いに干渉する可能性があるという事実によるものです。1つの例として、特定のディレクトリにファイルなどの排他的なリソースがある場合があります。または特定のデバイス。問題は、おそらくサードパーティのDLLの製造元でさえ誰も知らないということです。そのため、広範なテストが必要です。

しかし、多分あなたは幸運で、とにかくそれはうまくいきます。私のレシピ:

  1. DLL「DTAG.DLL」と必要なすべてのDLLを、「DTAG_LIB」などの固定名のアプリケーションディレクトリのサブディレクトリに配置します。
  2. インポートライブラリを手動で作成します(DELAYLOADを使用する他の可能性があります)。そのライブラリで、LoadLibraryExを使用してDLLをロードします。「 DTAG_LIB \DTAG.DLL」で終わる絶対パスとフラグLOAD_WITH_ALTERED_SEARCH_PATHを指定します。次に、WindowsはこのディレクトリからDTAG.DLLをロードし、必要なすべてのDLLもそのディレクトリからロードします。PATHを「DTAG_LIB」に設定しないでください。
  3. あなたの顧客はあなたの手動インポートライブラリに対してリンクする必要があります。
于 2012-05-25T13:15:08.620 に答える