我想加載一個DLL使用DllImport,它工作正常,如果我指定的DLL的路徑,但是,如果我沒有指定的DLL路徑,只需鍵入「foo.dll」 ,它抱怨「無法加載dll」,即使你已經將dll文件放入bin文件夾。無法加載DLL
我想如果我沒有指定dll路徑,它會認爲它會啓動與exe文件相同的文件夾中的dll,但它似乎並非如此。
有什麼建議嗎?
感謝
我想加載一個DLL使用DllImport,它工作正常,如果我指定的DLL的路徑,但是,如果我沒有指定的DLL路徑,只需鍵入「foo.dll」 ,它抱怨「無法加載dll」,即使你已經將dll文件放入bin文件夾。無法加載DLL
我想如果我沒有指定dll路徑,它會認爲它會啓動與exe文件相同的文件夾中的dll,但它似乎並非如此。
有什麼建議嗎?
感謝
在你的C++ DLL項目打開項目屬性,定位到C/C++ - >代碼生成。然後爲運行時庫設置用於調試配置的多線程調試(/ MTd)和用於發佈的多線程(/ MT)。之後,你可以把編譯後的dll放到你的輸出目錄中,並檢查它是否有效。隨時發表評論並提出問題。
UPD:
這裏是link to the simple little project,使用本機代碼,其測量電流CPU的頻率,DllImport'ed到C#項目代碼。
構建步驟: 1.在任何配置下構建C++項目(實際上,在本示例中使用什麼配置並不重要)。 2.在配置輸出文件夾(Debug | Release)中找到已編譯的dll 3.將找到的dll添加到C#項目的ExternalLibraries文件夾中,將action設置爲Copy If If Newest在文件屬性中(右鍵單擊lib - >屬性)。 4.編譯並運行C#項目 - >利潤。
爲什麼我向你提出這樣的建議:我的客戶要求一個能測量CPU頻率的代碼,我在我的機器上運行這個代碼很好,但客戶端沒有。它依賴於MS VC運行庫。爲Debug配置設置多線程調試(/ MTd)併爲所有依賴項的發佈代碼設置多線程(/ MT)之後,您的二進制文件將被嵌入,因此您至少可以解析一個依賴關係源。
嗨尤金,感謝您的項目,但是,它似乎是依賴性的問題,我不能只加載DLL,但要加載在其安裝的文件夾內的DLL,以確保所有的依賴項也加載。所以現在我需要某種機制來在運行時或配置文件中分配路徑,但我遇到了挑戰。 – PlayKid
它是你自己的dll或第三方?你能否提供一個鏈接或項目與該DLL? –
如果你不想使用一個路徑,你總是可以將dll放在Windows GAC(wiki link)中。這可能是一件很痛苦的事,因爲有時你需要簽名你的dll,但意味着可以在沒有路徑的情況下訪問。
您無法將本地* .dlls添加到GAC。 –
@WiktorZychla如果使用本地dll,你的意思是由用戶(不是我的微軟)創建的。這是你用來創建sharepoint的webparts的方式 - http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx – Dilvid
不可以。 「本地DLL」是一個win32的。只有這些由DllImport加載。 –
很可能您嘗試加載的DLL取決於其他資源。您可以通過首先調用遠程路徑上的Win32的LoadLibrary
來欺騙DllImport
。 DllImport
會注意到該庫已經被加載到內存中,它應該可以正常工作。
的代碼片段:
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("yourlibrary.dll")]
public static extern void Foo();
public void CallTheFooMethod()
{
// first load the library
LoadLibrary("C:/..........full path/yourlibrary.dll");
Foo();
}
你是什麼意思「我已經把dll文件到bin文件夾」是什麼意思?你的意思是'bin/Debug'嗎?你是否從Visual Studio以調試模式運行? –
@PlayKid,這可能是一個依賴問題。您可以使用[Dependency Walker](http://www.dependencywalker.com/)這樣的工具來檢查一切是否正確解決。 –
Webste或正常應用程序= fules是不同的。什麼語言?來吧,給我們這裏的基準信息。我們沒有看到你的肩膀。 – TomTom