![](/img/trans.png)
[英]unmanaged c++ dll called from c#, crashes when CString used in 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.