[英]When loading a C++ dll in C#, does the CLR load the dependencies of the C++ file automatically?
[英]Loading C# DLL to C++/CLI - dependencies directory
我寫了一個使用其他c#dll庫的dll c ++ / cli庫。 當我將c#dll與調用它的應用程序放在同一文件夾中時,C ++ / cli庫運行正常。 該庫最終將加載到許多應用程序,並且不得將C#dll與應用程序一起復制到目錄中。 它必須與c ++ / cli庫位於同一文件夾中,但是在那種情況下,我有System.IO.FileNotFoundException。 我的建議是手動加載c#庫或更改f.ex所在的路徑。 firefox正在尋找依賴關系,但我嘗試使用LoadLibrary()和Assembly :: LoadFrom()方法來強制從正確的目錄加載。 當然,我將帶有dll的目錄路徑添加到系統PATH中。 我在VS2010上工作。
您無需更改應用程序將在其中查找dll的默認目錄。
在設計時,將您的dll放在一個眾所周知的位置,即您將要部署到的位置。 添加對此的引用,確保將其設置為“永遠不要復制”,否則它將最終出現在bin文件夾中。 您必須執行此操作,否則它將無法編譯。
部署時,您需要一個軟件包來部署常見的dll,每個應用程序都需要一個。 如果appA與AppB相比需要公共dll的舊版本或新版本,請不要創建自己的dll hell版本。
將一個AppDomain.AssemblyResolve事件添加到main(對於Windows應用)。 在運行時,當您在dll中引用類型時,事件處理程序將被觸發,而程序集尚未加載。
在那兒,您可以從眾所周知的位置加載它。 通常在配置中,或在相對路徑中。
E.g.
AllMyApps
CommonDLLS
MyFirstApp
因此,您從中加載所需通用dll的路徑將是“ .. \\ CommonDlls \\ MyCommondll.dll”。
注意,您將需要以某種方式保護dll的安全,否則,一個壞人可能能夠將其版本的dll注入您的應用程序,這將是很糟糕的...
您可以使用此機制從遠程服務器或數據庫Blob中獲取dll。
最簡單的情況是只有幾行代碼,只需查找事件即可。 花了我大約15分鍾才能在類似的情況下進行操作。
但是不在這台機器上,否則我將粘貼代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.