C 把dll放在不同的目錄讓你的程式更整潔

2021-07-26 05:01:55 字數 2105 閱讀 1882

想必c#的開發者都遇到過這個問題,引用的dll都放在根目錄下,隨著專案的日益增大,根目錄下充滿了各種各樣的dll,非常的不美觀。

如果能夠把dll按照想要的目錄來存放,那麼系統就美觀多了,以下是我常用的程式各檔案的分布:

【mylibs】

【resources】

【images】

excecutable.exe

網上有很多的文章述說這個,比如使用assembly.load,但是沒有說明在程式中怎麼使用,也沒有給出具體的**。這裡我結合自己多年的實踐經驗,再把整個流程和方法詳細敘述一遍,以便各位看官有個具體的體會。

clr解析乙個程式集會在乙個根目錄內進行搜尋,整個探索過程又稱probing,這個根目錄很顯然就是當前包含當前程式集的目錄。

程式搜尋dll的順序如下(區分強名稱簽名的和沒有強名稱簽名的程式集):

沒有做強名稱簽名的程式集:

具有強名稱簽名的程式集:

我們看到,上面的順序無論是否有強名稱簽名看,都提到了乙個名詞「私有目錄」

——【推薦】

這是最簡單的方法,當然也有一定的侷限性,就是沒法對dll做控制,另外,無法解決第三方dllimprt中引入的程式集不在根目錄下的問題,不過無論怎麼說,這個都基本解決了問題。

配置如下,多個目錄用;分隔

xmlns="urn:schemas-microsoft-com:asm.v1">

privatepath="3rdlib;mylibs;subfolder\sub.dll"/>

assemblybinding>

runtime>

方法二:訂閱程式集解析事件assemblyresolve在**中解析

這也正是assembly.loadassembly.loadfrom等方法的用武之地。

assembly currentdomain_assemblyresolve(object sender, resolveeventargs args)

方法三:在載入使用到dll的**之前設定重置當前環境的目錄

這個方法就是通過environment.currentdirectory=custompath,這樣,在呼叫dll方法時,因為目錄已經切換到了

這是乙個取巧的方法,不是很實用,要來回切換程式集目錄,但是在某些情況下非常好用

自己寫dllimport

如果是自己寫,那麼久好控制了,可以直接指定相對的目錄dllimport(3rdlibs\nlog.dll)。不過這種方法不一定可靠,在某些系統硬是載入不了,如果使用了dllimport還是,推薦下面的另外一種方法。

引用的c#的外掛程式又使用了dllimport

這是很多文章都沒有提及的:

因為無法更改路徑,那麼只能夠使用上述特殊的方法,更改當前程式的路徑

當然,還有更省事一點的做法,就是在系統環境中,增加一條記錄,指向要載入的dll的所在目錄。因為c++的**中,windows目錄和windows\system32目錄以及環境變數設定的目錄都是搜尋路徑之一。

這裡提供怎麼從c#中修改系統環境變數的**:

static

void

addenvironmentpaths(ienumerable paths)

; string newpath = string.join(path.pathseparator.tostring(), path.concat(paths));

environment.setenvironmentvariable("path", newpath);

}

如何讓程式識別不同目錄下的dll

我們看到,上面的順序無論是否有強名稱簽名看,都提到了乙個名詞 私有目錄 推薦 這是最簡單的方法,當然也有一定的侷限性,就是沒法對dll做控制,另外,無法解決第三方dllimprt中引入的程式集不在根目錄下的問題,不過無論怎麼說,這個都基本解決了問題。配置如下,多個目錄用 分隔 xmlns urn s...

Oracle 把錶和索引放在不同的表空間裡

oracle 把錶和索引放在不同的表空間裡 oracle中並沒有區分表空間裡放的是表還是索引,所有當資料量比較小時,完全可以把錶和索引放在同乙個表空間裡,但隨著資料量的增大,最好還是把錶和索引分開儲存在不同的表空間裡,因為 1 提高效能 盡量把錶和索引的表空間儲存在不同在磁碟上,把兩類不同io性質的...

Oracle中如何把錶和索引放在不同的表空間裡

因為 1 提高效能 盡量把錶和索引的表空間儲存在不同在磁碟上,把兩類不同io性質的資料分開放,這樣可以提高磁碟的io總體效能 2 便於管理 試想一下,如果索引的資料檔案損壞,只要建立索引即可,不會引起資料丟失的問題。下面語句用於移動索引的表空間 複製 yguifpe 如下 alter index i...