1. 程式人生 > >C# 配置引用程式集的路徑(分離exe和dll從指定路徑呼叫)

C# 配置引用程式集的路徑(分離exe和dll從指定路徑呼叫)

問題:在開發較大的專案時,會引用很多其他專案的dll,而我們規劃將不同型別的dll放在不同的功能目錄下,此時我們通過反射動態載入時,出現System.IO.FileNotFoundException: 未能載入檔案或程式集的問題。

程式集DLL分為兩類:

2)私有DLL,預設情況下,新增程式集引用的時候,程式集DLL會複製到可執行目錄下。
對於私有DLL,當數目眾多時,由於沒有分類,會顯得比較凌亂。在釋出軟體的時候也不希望在軟體安裝目錄下看到大量的dll檔案。如果能將其分類放在不同的資料夾下就再好不過了。
問題是,如何解決應用程式對DLL的查詢路徑問題呢?答案是在配置檔案中新增如下配置項。(app.config或者web.config,沒有就新建,新增->配置檔案)

<configuration>
<runtime>
      <!--xmlns是必需的特性。指定程式集繫結所需的 XML 名稱空間。 使用字串“urn: 架構-microsoft-com:asm.v1”作為值。-->
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <publisherPolicy apply="yes"/>  <!--指定執行時是否使用釋出者策略-->
        <!--指定載入程式集時公共語言執行時搜尋的子目錄, 其中privatePath是相對於*.exe.config檔案的相對路徑,多個資料夾以分號分隔。-->
        <probing privatePath="Common;Security"/>
    </assemblyBinding>
  </runtime>
</configuration>

其中privatePath是相對於*.exe.config檔案的相對路徑,多個資料夾以分號分隔。當編譯後會在生成目錄下生成一個字尾為.exe.config的檔案,就是相對這個檔案的。
新增程式集DLL引用之後,將DLL的屬性“複製本地”設定為False。程式編譯過程中,會自動檢索Common和Security資料夾下的DLL及其依賴項。