.Net引用根目錄子文件夾下的dll文件

在.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"/>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章