簡體   English   中英

調用函數時,非托管依賴項dll無法加載

[英]Unmanaged dependency dll fails to load when functions called

我正在使用XP中Cygwin中的Makefile,但使用的是Visual Studio 2005命令行編譯器。 未管理的代碼是用C ++編寫的,托管的代碼是Managed C ++。

我有一個項目,該項目創建了一堆非托管DLL和一個托管DLL。 托管DLL是一個非托管DLL的包裝,然后該非托管DLL引用了許多其他非托管DLL。

例如->非托管/托管->非托管->非托管\\->非托管等;

我有一個托管代碼測試驅動程序,用於加載托管DLL,創建對象以及對托管包裝程序進行調用。

所以這就是事情。 只要我將所有需要的DLL與測試驅動程序可執行文件放在同一目錄中,一切就可以正常工作。 但是,我需要將DLL移到與測試驅動程序exe不同的目錄。

如果我將所有內容移至其他目錄,則所有內容都會停止工作。 (運行test.exe時我什至沒有收到錯誤,它“運行”然后返回命令行。)顯然,這是DLL問題。

(請注意,我不能使用GAC或%PATH%以便test.exe可以找到DLL。)

因此,我進行了大量搜索,並嘗試了多種方法來弄清楚如何獲取test.exe以查看DLL。

我嘗試了“應用程序指定的路徑”。 沒用 后來從http://msdn.microsoft.com/zh-cn/library/ms682586%28VS.85%29.aspx中讀取到,“在計算DLL搜索路徑時不使用“應用程序路徑”鍵。”

我嘗試了清單文件的各種操作。

我嘗試了一堆極有可能無法解決的事情,但我變得絕望了。

最近,我嘗試了app.config方法。

使用最后一種方法,我已經取得了一些成功,因為test.exe運行,但在test.exe嘗試執行DLL調用時在運行時死於錯誤。 然后執行任何操作。

例如,如果我運行test.exe,它將詢問用戶一些信息。 如果信息不正確,則將錯誤返回給用戶,但是如果信息正確,則將返回此錯誤:

“錯誤:發生了ASCII解析錯誤:無法加載動態庫[ATC15.dll]。找不到指定的模塊。”

然后,test.exe繼續執行其余代碼。

因此,請幫助我了解如何獲取可執行文件以“查看”所有DLL。

漢斯說的很對。 我看過SetDLLDirectory(忘了提一下),但我從來沒能使它正常工作。 我總是得到相同的結果:執行程序,什么也不會發生。

但是,我接受了他的建議並重新研究了SetDLLDirectory函數。 我補充說:

#include "windows.h"
WINBASEAPI
BOOL
WINAPI
SetDllDirectoryA(
__in_opt LPCSTR lpPathName
);
#define SetDllDirectory SetDllDirectoryA

到我的代碼的開頭,然后還調用了SetDLLDirectory(“ c:\\ path”); 然后重新編譯。 運行該程序,但仍然無法正常運行。

但后來我在目錄中添加了一個app.config文件

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <probing privatePath="putDLLsHere"/>
         <dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

一起工作。

謝謝漢斯為我指出正確的方向!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM