簡體   English   中英

C#項目如何鏈接程序集

[英]How C# projects link the assemblies

我想問一個有關C#如何鏈接其依賴項的方式的問題。

第一種情況:我有一個C#項目,可以鏈接例如系統程序集。 如果我從Assembly-> Framework窗口添加引用: 在此處輸入圖片說明

然后在參考視圖上雙擊“系統”程序集: 在此處輸入圖片說明

程序集的路徑為: C:\\ Program Files(x86)\\ Reference Assemblies \\ Microsoft \\ Framework.NETFramework \\ v4.5.2 \\ System.dll

但是,如果啟用了.nuget並下載了程序集,則指向系統程序集的鏈接將被神奇地更改為: C:\\ Users \\ .nuget \\ packages \\ Microsoft.NETCore.Portable.Compatibility \\ 1.0.0 \\ ref \\ netcore50 \\ System.dll中

我之所以說“神奇”是因為我看不到明確指出的地方-從現在開始沿那個方向進行組裝。

第二種情況:當我下載了.nuget程序集時,在“項目參考”窗口中,我看到下一件事:

在此處輸入圖片說明

不同版本的兩個程序集鏈接到我的項目,一個來自.nuget所在的地方,另一個來自.NET Framework所在的地方。 問題:將考慮哪一個? 都?

不過,只是一個想法。

當我使用C ++項目時,一切都非常清晰明了,我可能安裝了幾種不同的SDK,但是當我定義要使用的SDK版本和工具集時,-該項目將從定義的位置獲取程序集。 除非我指定,否則它不會嘗試從其他位置加載內容。

也許C#項目具有類似的配置功能,但我不了解它們。 有人可以幫助我理解這一點嗎?

更新

剛意識到我在這里的聲明: 當我下載了.nuget程序集時,在“項目參考”窗口上,我看到了下一件事:可能令人困惑。 將我列出的全屏快照添加到不同的程序集版本: 在此處輸入圖片說明

另外,添加我的項目文件屏幕快照,以表明它沒有明確指出要從哪里組裝的位置: 在此處輸入圖片說明

這個問題有點混亂。 您需要考慮的重要區別是Visual Studio如何引用程序集以及編譯后的應用程序將如何進行引用

視覺工作室

當您在Visual Studio中添加引用時,它將在csproj文件中添加一條記錄:

<Reference Include="Microsoft.Owin, Version=3.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\..\packages\Microsoft.Owin.3.1.0\lib\net45\Microsoft.Owin.dll</HintPath>
  <Private>True</Private>
</Reference>

上面包含“提示路徑”。 這就告訴Visual Studio它認為程序集所在的位置。 編譯應用程序時,VS將檢查此路徑以進行匯編。

當您使用Nuget安裝部件時。 Nuget將程序集添加到packages文件夾,並將對該程序集的引用添加到您的csproj文件中。 帶有指向該位置的提示路徑。 因此,VS將在此位置加載程序集。

匯編

編譯應用程序時,其結果是可運行的應用程序(dll,exe等)。 此可運行的應用程序是C#的機器代碼翻譯。 它包括“鏈接”(DLL代表d ynamic 大號墨液L ibrary)至組件。

bin文件夾

編譯應用程序時,VS中的引用將有兩個選項:

在此處輸入圖片說明

如果copy localTrue Visual Studio將在構建清單中包含dll。 這基本上意味着dll將最終位於bin文件夾中。 如果為假,它將不包含它,並且將假定該應用程序將能夠從其他地方引用此程序集。

那么它還能從哪里加載程序集呢?

您的已編譯應用程序將基於層次結構查找程序集。 查找與清單匹配的程序集的第一個位置是bin文件夾。 正如我們已經指出的,盡管程序集並不總是在這里。

如果在這里找不到它,它將檢查正在運行的計算機,以查看是否可以訪問這些程序集。 它檢查的下一個位置是稱為全局程序集緩存的概念。 這是在機器和組件位置上注冊的組件的寄存器。

如果仍然找不到它,它將拋出異常。

兩個不同版本的程序集鏈接到我的項目中,將考慮哪一個? 都?

不,它不能同時使用。 注釋中所述,您可以使用alias來引用特定的程序集,但是每次仍使用一個程序集。

如果您沒有指定alias ,那么我不希望它起作用嗎? 我希望VS抱怨它不知道要使用哪個。 您可以在app.config / web.config配置app.config的程序集:

  <dependentAssembly>
    <assemblyIdentity name="Newtonsoft.Json" culture="neutral" publicKeyToken="30ad4fe6b2a6aeed" />
    <bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
  </dependentAssembly>

這會將競爭程序集映射到一個特定版本(通常是最新版本)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM