.Net引用根目錄子資料夾下的dll檔案

mytudousi發表於2023-01-03

在.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"/>

相關文章