3

問題: A.dll が別の SXS-lib (私の場合は MSVCR90.DLL) に依存している場合、p/invoke を使用して DLL A.dll から関数を呼び出す方法は?

pinvoke を使用して DLL 内で関数を呼び出したいと思います。pinvoke 自体は、他のライブラリでは問題なく動作します。アンマネージ C++ から DLL 内の関数を呼び出すことも正常に機能します。

問題は、DLL が一部の SXS フォルダに存在する MSVCR90.DLL への参照を持っていることです。

C++ で LoadLibrary を使用すると、前述のようにライブラリを使用できます。C# を使用して、ライブラリをロードする方法がわかりません。コンピュータに MSVCR90.DLL が見つからないというエラーが常に表示されます。

ライブラリのロードは次のようになります。

[DllImport("C:\\work\\dllhell\\sample\\sample.dll", 
    EntryPoint = "sample", CallingConvention = CallingConvention.Cdecl)]
public static extern int sample();

関数を呼び出すとsample、次のエラーのみが表示されます: HRESULT: 0x8007007E は、ライブラリが見つからなかったことを示しています。実際、ライブラリは SXS ディレクトリにさまざまなバージョンで存在します。

Dependency Walker (依存) を使用してみましたが、これまでのところ、適切なバージョンのライブラリを見つけることもできませんでした。

次のエントリを含むライブラリに付属するマニフェストもあります。

次のステートメントがマニフェストに含まれています。

<assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8'
    processorArchi    tecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />

要求されたバージョンは私のマシンに存在します。私はそのライブラリの新しいバージョンを出荷する VS 2010 を使用していますが、それは問題にはならないはずです。

同様の問題について議論している多くのスレッドを見つけました。依存関係の問題があることはわかっていますが、解決策がどこにも見つかりませんでした。不足している依存関係はわかっています。マニフェストがありますが、C# でも同じようにする必要がありますか? アンマネージ C++ だけではありませんか?

4

1 に答える 1

2

誰かがその問題を検索した場合: もちろん、David Heffernan が問題を解決しました。アプリケーションのマニフェスト、つまりファイル app.manifest に依存関係を追加する必要があります。そのようなファイルがない場合は、プロジェクトに新しいマニフェストとして作成します。 、 まだ。

次のエントリで十分です。

  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>

このエントリは、XML ファイルのルート ノード アセンブリに直接移動します。

David Heffernan のおかげで、私の最後のコメントは忘れてください。それは私の質問に対する解決策でした。

于 2012-02-01T16:57:58.227 に答える