.Net參照根目錄子資料夾下的dll檔案

2023-01-03 12:00:27

在.Net開發的時候,有時候會參照一套庫,這些庫是由多個dll檔案。正常情況下,這些dll檔案需要拷貝到執行根目錄下。如果這些dll檔案比較多,加上其他直接參照的dll,這樣會導致根目錄下非常亂。我們希望可以把參照的這套庫單獨放在根目錄下一個單獨的資料夾中,讓系統可以直接參照,該如何做呢?

例如我們想基於DotSpatial開發的時候,想直接使用該庫的一個擴充套件DotSpatial.Data.Rasters.GdalExtension。GdalExtension中在DotSpatial中的位置如下圖所示。

截圖.png

DotSpatial.Data.Rasters.GdalExtension.dll檔案為該擴充套件的主dll檔案,其他的檔案以及資料夾都是該主dll檔案依賴的庫和資源。DotSpatial中,系統通過AppManager類的LoadExtensions函數,載入執行目錄下的擴充套件庫,載入柵格資料時,根據擴充套件名,可以自動呼叫GdalExtension模組。

如果我們不呼叫AppManager類的LoadExtensions函數,而直接想使用GdalExtension?我們直接參照到Application Extensions\DotSpatial.Data.Rasters.GdalExtension目錄下的DotSpatial.Data.Rasters.GdalExtension.dll檔案,通過下面的程式碼呼叫其檔案中的函數,程式碼如下所示。

GdalRasterProvider myGdalRasterProvider = new GdalRasterProvider();
IRaster demRaster = myGdalRasterProvider.Open(@"E:\SaudiTestData\028C_Data\028C_DEM_Slope.tif");

這樣在執行到第一行程式碼的時候,系統就會報找不到依賴的dll檔案錯誤。如下圖所示。

截圖.png

要解決這個問題,我們就必須把Extensions\DotSpatial.Data.Rasters.GdalExtension資料夾的所有檔案都拷貝到系統執行根目錄下。這樣還是回到了原來的解決方案,會導致根目錄下檔案非常混亂。

我們通過下面的方法解決該問題。

1、首先我們先設定App.config檔案。程式碼如下所示。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
    </startup>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="Application Extensions\DotSpatial.Data.Rasters.GdalExtension"/>
        </assemblyBinding>
     </runtime>
</configuration>

在App.config檔案中,在runtime節點中,新增assemblyBinding節點,並在該節點下新增probing節點,在屬性privatePath設定要參照的dll檔案所在的目錄。

2、在參照DotSpatial.Data.Rasters.GdalExtension.dll檔案的時候,拷貝到本地項設定為False。如下圖所示。

截圖.png

設定後,在執行程式碼,就可以執行成功,如下圖所示。

截圖.png

我們跟蹤下資料,確認已經讀取成功,如下圖所示。

截圖.png

如果有多個類似的模組目錄,那就使用;號隔開。App.config檔案中,程式碼如下所示。

<probing privatePath="A\A_0;B;C\C_0;C\_1"/>