2009-12-10 138 views
83

.csproj文件中的HintPath.csproj.user文件中的ReferencePath究竟有什麼區別?我們試圖提交一個約定,其中依賴關係DLL處於「發佈」svn回購庫中,並且所有項目都指向特定版本。由於不同的開發人員具有不同的文件夾結構,因此相對引用無效,因此我們想出了一個方案,使用指向特定開發人員發佈文件夾的環境變量創建絕對引用。因此,在添加引用後,我們手動編輯項目文件以使用環境變量將引用更改爲絕對路徑。Visual Studio中的HintPath與ReferencePath

我注意到,這可能與HintPathReferencePath都可以做到,但我可以在它們之間找到的唯一區別是,HintPath在編譯時和ReferencePath當項目被裝載到IDE解決。我不確定這些後果是什麼。我注意到VS有時會重寫.csproj.user,我不得不重寫ReferencePath,但我不確定是什麼觸發了這個。

我聽說最好不要檢查.csproj.user文件,因爲它是用戶特定的,所以我想爲此目的而努力,但我也聽說HintPath指定的DLL不是「保證「如果相同的DLL是例如加載位於項目的輸出目錄中。對此有何想法?

回答

96

根據這個MSDN博客:https://blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolving-file-references-in-team-build-part-2/

沒有爲組件查找順序構建時。搜索順序如下:

  • 來自當前項目的文件 - 由$ {CandidateAssemblyFiles}指示。
  • $(ReferencePath)屬性來自.user/targets文件。
  • %(HintPath)由參考項目指示的元數據。
  • 目標框架目錄。
  • 在使用AssemblyFoldersEx註冊的註冊表中找到的目錄。
  • 已註冊的程序集文件夾,由$ {AssemblyFolders}指示。
  • $(OutputPath)或$(OUTDIR)
  • GAC

因此,如果所需的組件由HintPath,但可替換組件中發現可以用ReferencePath中找到,它會更喜歡'd彙編至HintPath'd。

5

我自己的經驗是,它最好是堅持兩個種中的一種集引用:

  • A「本地」裝配在當前構建目錄
  • 的組件在GAC

我發現(很像你所描述的)其他方法要麼太容易破碎,要麼煩人的維護要求。

任何程序集我不想GAC,必須住在執行目錄中。任何不在或不在執行目錄I GAC(由自動構建事件管理)的程序集。

到目前爲止,這並沒有給我任何問題。雖然我確定有一種情況無法正常工作,但任何問題的常見答案都是「哦,只是GAC!」。 8 D

希望有所幫助!

19

查看文件Microsoft.Common.targets

的問題的答案是文件Microsoft.Common.targets爲你的目標框架版本英寸

對於.NET Framework版本4.0 AssemblySearchPaths元素的定義是這樣的(和4.5!):

<!-- 
    The SearchPaths property is set to find assemblies in the following order: 

     (1) Files from current project - indicated by {CandidateAssemblyFiles} 
     (2) $(ReferencePath) - the reference path property, which comes from the .USER file. 
     (3) The hintpath from the referenced item itself, indicated by {HintPathFromItem}. 
     (4) The directory of MSBuild's "target" runtime from GetFrameworkPath. 
      The "target" runtime folder is the folder of the runtime that MSBuild is a part of. 
     (5) Registered assembly folders, indicated by {Registry:*,*,*} 
     (6) Legacy registered assembly folders, indicated by {AssemblyFolders} 
     (7) Resolve to the GAC. 
     (8) Treat the reference's Include as if it were a real file name. 
     (9) Look in the application's output folder (like bin\debug) 
    --> 
<AssemblySearchPaths Condition=" '$(AssemblySearchPaths)' == ''"> 
    {CandidateAssemblyFiles}; 
    $(ReferencePath); 
    {HintPathFromItem}; 
    {TargetFrameworkDirectory}; 
    {Registry:$(FrameworkRegistryBase),$(TargetFrameworkVersion),$(AssemblyFoldersSuffix)$(AssemblyFoldersExConditions)}; 
    {AssemblyFolders}; 
    {GAC}; 
    {RawFileName}; 
    $(OutDir) 
</AssemblySearchPaths> 

對於.NET Framework 3.5的定義是相同的,但評論是錯誤的。 2.0定義略有不同,它使用$(OutputPath)而不是$(OutDir)。

在我的機器我有文件Microsoft.Common.targets以下版本:

C:\Windows\Microsoft.NET\Framework\v2.0.50727\Microsoft.Common.targets 
C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets 

C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Microsoft.Common.targets 
C:\Windows\Microsoft.NET\Framework64\v3.5\Microsoft.Common.targets 
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets 

這是一臺安裝在Windows 7

事實的Visual Studio 2008年,2010年和2013年這輸出目錄被搜索可能有點令人沮喪(如原始海報指出),因爲它可能隱藏不正確的HintPath。該解決方案在您的本地計算機上生成「確定」,但在建立在乾淨的文件夾結構(例如生成計算機)上時會中斷。

+0

我有類似的問題,在這種情況下,我應該在哪裏放置dll文件?框架或框架64? https://stackoverflow.com/questions/45945579/where-to-place-the-dll-files-to-resolve-the-reference – 2017-08-30 15:06:14

0

儘管這是一箇舊文檔,但它幫助我解決了在另一臺機器上忽略'HintPath'的問題。這是因爲引用的DLL需要在源代碼控制,以及:

https://msdn.microsoft.com/en-us/library/ee817675.aspx#tdlg_ch4_includeoutersystemassemblieswithprojects

摘錄:

 
To include and then reference an outer-system assembly 
1. In Solution Explorer, right-click the project that needs to reference the assembly,,and then click Add Existing Item. 
2. Browse to the assembly, and then click OK. The assembly is then copied into the project folder and automatically added to VSS (assuming the project is already under source control). 
3. Use the Browse button in the Add Reference dialog box to set a file reference to assembly in the project folder.