簡體   English   中英

強制程序使用 %temp% 文件夾中的 dll

[英]Force program to use the dll from the %temp% folder

我想強制編譯的程序使用%temp%文件夾中的 dll 。

但是,如果我這樣做

compars.EmbeddedResources.Add(Path.GetTempPath() + "\\Newtonsoft.Json.dll");
compars.ReferencedAssemblies.Add(Path.GetTempPath() + "\\Newtonsoft.Json.dll");

程序崩潰。

I have also added using Newtonsoft.Json.dll but I still need to have the Newtonsoft.Json.dll in the same folder as my program, if so, the program isn't crashing, otherwise it crashes even if Newtonsoft.Json.dll位於%temp%文件夾中。 所以一般來說,我想成功運行程序,而不需要dll在同一個文件夾中,並強制它使用來自%temp%或類似的東西的dll

您可以更輕松地將其他dlls嵌入到您的程序中。 請參考以下鏈接:

stackoverflow.com/questions

您也可以使用ILMerge自動執行此操作。

您還可以使用try-catch將代碼括起來以獲取更多詳細信息。 我猜你的 dll 版本不相等或一些類似的問題。

將引用的程序集添加到編譯器參數(我假設這是compars所指的)將確保編譯器在編譯時使用 dll 作為參考。 在編譯程序執行期間,操作系統將嘗試以“通常的方式”定位引用的程序集。

有很多詳細的規范,您可以 24/7 閱讀它們直到您去世(例如https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order )。

但是要完成您想要的,即讓已編譯的程序在運行時使用臨時文件夾中的特定dll ,您可以按照 Mostafa Khodakarami 的回答中的建議將其與 ILMerge 合並。 圖書館將成為您不可分割的一部分。 您的 dll 不會有找不到所需參考的風險,但如果有可用的參考庫的更新版本,它也不會使用。 根據您進行合並的方式,您也可能無法與使用該庫的其他第三方庫共享使用該庫創建的對象,除非您也合並它們。

進行合並的另一個工具是 ILRepack(參見https://github.com/gluck/il-repack ),它吹噓自己比 ILMerge 更好。 我們從 ILMerge 切換到 ILRepack,因為我們達到了 ILMerge 中對象數量的某種內部限制。

最后,您還可以讓您的程序通過使用“手動”加載dll本身

public static System.Reflection.Assembly LoadFrom (string assemblyFile);

(參見https://docs.microsoft.com/en-us/dotnet/api/system.reflection.assembly.loadfrom?view=net-6.0

在程序開始時調用這樣的方法,在調用任何方法或創建使用該庫的對象之前:

Assembly.LoadFrom(Path.GetTempPath() + "\\Newtonsoft.Json.dll");

暫無
暫無

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

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