2011-11-07 10 views
3

短く問題:A.dllが別のSXS-lib(私の場合はMSVCR90.DLL)に依存する場合、p/invokeを使用してDLL A.dllから関数を呼び出す方法?他のSXS-DLLに依存するDLLのためピンボケが失敗する

私はpinvokeを使ってDLL内の関数を呼び出したいと思います。 pinvoke自体は他のlibsでうまく動作します。 DLLの関数をアンマネージC++から呼び出しても問題ありません。

問題は、DLLに、一部のSXSフォルダにあるMSVCR90.DLLへの参照があることです。

C++でLoadLibraryを使用すると、前述のようにライブラリを使用できます。 C#を使用すると、ライブラリをロードする方法がわかりません。私はいつも、MSVCR90.DLLがコンピュータにないというエラーを受け取ります。ライブラリが発見されていないだろうと言って0x8007007E:HRESULT:

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

機能sampleを呼び出すとき、私は次のエラーを取得する:

これは、ライブラリをロードするように見えるものです。実際には、ライブラリはSXSディレクトリのさまざまなバージョンに存在します。

私はDependency Walker(依存)を使用しようとしましたが、これまでのところ正しいバージョンのライブラリを見つけることができませんでした。

次のエントリを含むライブラリに同梱マニフェストもあります:

次の文は、マニフェストの中に含まれています、要求されたバージョンは、私のマシン上に存在する

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

私が使用していますそのライブラリの新しいバージョンを出荷しているVS 2010でも問題はないはずです。

同様の問題について多くのスレッドが見つかりました。私は依存関係の問題があるが、私は解決策を見つけることができないことを知っている。私は私の欠けている依存関係を知っている、私はマニフェストを持っているが、C#のためにそれを行う必要がありますか?管理されていないC++だけでなく、

+0

詳細については、Windowsアプリケーションイベントログを参照してください。 –

+0

あなたのコメントをありがとう、残念ながら私はそこに新しい詳細を見つけることができませんでした。これは、存在しないDLL、またはMSVCR90.DLLに依存するDLLをロードしようとするかどうかにかかわらず、同じエラーを表示します。エラーは、DLLから関数を呼び出そうとする位置にDllNotFoundExceptionがあります。 – user1034081

+0

ここからは見えません。バージョン番号に注意してください。そのDLLを展開します。 –

答えて

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のおかげで、私の最後のコメントを忘れてしまいました。それは私の質問に対する解決策でした。

関連する問題