2011-11-07 84 views
3

問題:如何從DLL A.DLL採用對調用一個函數/調用時A.DLL依賴於另一個SXS-LIB(在我的情況MSVCR90.DLL) ?PInvoke的失敗,因爲DLL文件的依賴在​​短期其他SXS的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++?

+0

查看Windows應用程序事件日誌中的確切詳細信息。 –

+0

感謝您的評論,很遺憾,我找不到任何新的細節。它只是顯示相同的錯誤,無論我是否嘗試加載一個不存在的DLL或對MSVCR90.DLL有依賴關係的DLL。錯誤表明在我試圖從DLL調用某個函數的位置出現了DllNotFoundException。 – user1034081

+0

我從這裏看不到它。注意版本號。獲取該DLL部署。 –

回答

2

如果有人搜索這個問題:當然,大衛Heffernan已經解決了這個問題,依賴項必須被添加到應用程序的清單,即文件app.manifest,創建它作爲項目中的新清單,如果有是不是這樣的文件,但。

以下項是足夠:

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

此條目直接發送給XML文件中的根節點組件。

感謝大衛赫弗南,忘了我最後的評論,它一直是解決我的問題。