2017-07-21 21 views
0

我有一個使用外部組件,位於/庫文件夾的項目。 當我構建項目時,我不想將所有這些程序集複製到bin文件夾中,因爲它們已經在/ libs中!所以我設置CopyLocal = false,但編譯器找不到這些程序集。CopyLocal =假filenotfound

我見過this related post但我完全失去了這個GAC和所有這些C#的細節。

有人可以解釋爲什麼它如此複雜,而不僅僅是編譯器:如果程序集在路徑P上引用,我將它加載到路徑P上,如果copylocal = false,我不會將它添加到我的構建中?

+0

如果你不想註冊組件與GAC或惹的文件路徑,然後請你幫個忙,並讓他們在同一文件夾作爲您的可執行文件。 – hoodaticus

+0

我寧願亂用文件路徑;)我想了解它是如何工作的 – fazega

+0

然後,Derek給了你你應該接受的答案。您可以重寫程序集解析過程,並使用C#代碼自己在運行時查找並加載DLL。 – hoodaticus

回答

1

通常情況下,一個bin文件夾的目的是爲您的部署包的主要成分。在非常簡單的應用程序部署中,程序需要的所有內容都存在於bin文件夾中。你可以複製粘貼該文件夾在任何地方,它會工作。當然,如果你的外部裝配不在那裏,那不會發生。

你發現那些程序集不應該存在於你的開發機器上的兩個地方,我明白你爲什麼不喜歡那個。 CopyLocal默認設置爲true的原因是因爲我上面描述的典型場景值得在開發機器中存在兩次程序集的成本。通常情況下,應用程序將比開發機器多出許多倍的客戶端機器,因此單個部署文件夾的簡單性值得開發機器上磁盤空間的成本。

你說你自己,你會包括:每當你想給你的exe文件給別人lib文件夾?僅僅給bin文件夾添加所有內容不是更簡單嗎?

在你原來的問題中,你提到編譯器找不到程序集,我認爲這是不正確的,我測試了類似的情況。編譯器找到了程序集,但是當我嘗試執行代碼時,運行時告訴我它找不到它。編譯器不會插入代碼以使可執行文件查找程序集的相對路徑。您可以找到.Net外部程序集here的詳細探測行爲。你的EXE不能奇蹟般地猜到程序集是在父文件夾的lib文件夾中。

您可以通過編寫自己的程序集分辨率來規避所有這些情況,但除非您要捱餓幾千字節的磁盤空間,否則讓Visual Studio可以做到這一點。

+0

完美的答案。 – fazega

3

如果你想分享這個節目與別人?你必須給他們bin文件夾和lib文件夾,也許他們必須在Windows資源管理器中的不同級別(以便能夠找到它們)。當您的程序用完bin文件夾時,它需要知道在哪裏找到需要運行的文件。最簡單的方法之一是打開本地副本,以便將其複製到bin文件夾中。你也可以查看「AssemblyResolve」,但它有點複雜,我不認爲你會想進入。

+0

不明白你的觀點。如果我需要給某人這個程序(實際上是這種情況),我會給他/ libs和.exe,如果我告訴他它在./libs中,.exe應該找到程序集。我不明白將它放入/ bin並將其放入/ libs中的區別。 – fazega

+2

@FaZeGa「.exe應該找到程序集」你必須編寫代碼。你已經告訴編譯器組件在哪裏,但不是.exe。默認情況下,exe文件將在GAC中查看,在當前文件夾中,執行一些[探測](https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-the-runtime-locates-assemblies)和然後爆炸。 –