2012-07-10 1062 views
4

我是新的dotnet.I有一個dotnet dll通過使用DllImport加載c dll。我想將所有dll放在與應用程序位置不同的文件夾中。我不想修改環境變量。所以我使用setdlldirectory API並通過Assembly.Loadfrom(..)加載我的c#程序集。我通過驗證GetDllDirectory(..)的值檢查了SetdllDirectory工作正常。但它既沒有從該文件夾加載C#DLL也沒有C DLL。通過指定Assembly.Loadfrom中的路徑,我可以加載C# dll。但無法加載c dll。從c#中的SetdllDirectory中指定的路徑加載dll#

在此先感謝!

回答

0

查看LoadFrom的文檔,您會發現它說:如果assemblyFile存在本機映像,則不會使用它。程序集不能以域爲中性加載。

我相信你將需要將DLL目錄添加到EXE的路徑。

11

我建議加入的目錄路徑PATH環境變量在運行時,使用下面的代碼:

var dllDirectory = @"C:/some/path"; 
Environment.SetEnvironmentVariable("PATH", Environment.GetEnvironmentVariable("PATH") + ";" + dllDirectory); 

這樣一來,變化隻影響到正在運行的進程和退出時被丟棄。

+0

其實我不想修改任何環境變量。有沒有什麼辦法可以從SetDllDirectory中指定的路徑加載C#dll和c#dll? – 2012-07-11 04:28:59

+0

這是最簡單的方法,你根本不必使用SetDllDirectory。當通過.NET interop(DllImport)加載dll時,不會使用通過SetDllDirectory函數設置的路徑,您必須使用LoadLibrary(kernel32.dll)來獲取函數指針,然後使用編組獲取該dll函數的委託。這可能是helpul:http://stackoverflow.com/a/1750938/1515409 – Tomek 2012-07-11 05:50:25

+0

這適用於我。謝謝。 – zionpi 2013-06-07 05:45:38