विजुअल स्टूडियो में हिंटपाथ बनाम संदर्भपाठ


120

वास्तव में क्या अंतर है HintPathएक .csproj फ़ाइल में और ReferencePathएक में .csproj.userफ़ाइल? हम एक सम्मेलन के लिए प्रतिबद्ध होने की कोशिश कर रहे हैं जहां निर्भरता DLL एक "रिलीज" svn रेपो में है और सभी परियोजनाएं एक विशेष रिलीज के लिए इंगित करती हैं। चूंकि अलग-अलग डेवलपर्स के पास अलग-अलग फ़ोल्डर संरचनाएं हैं, इसलिए रिश्तेदार संदर्भ काम नहीं करेंगे, इसलिए हम एक विशेष संदर्भ के रिलीज़ फ़ोल्डर की ओर इशारा करते हुए एक पर्यावरण चर का उपयोग करने के लिए एक योजना लाए। इसलिए एक संदर्भ जोड़ने के बाद, हम पर्यावरण चर का उपयोग करके किसी निरपेक्ष पथ पर संदर्भ बदलने के लिए प्रोजेक्ट फ़ाइल को मैन्युअल रूप से संपादित करते हैं।

मैंने देखा है कि यह HintPathऔर दोनों के साथ किया जा सकता है ReferencePath, लेकिन एकमात्र अंतर जो मुझे उनके बीच मिल सकता है वह HintPathहै बिल्ड-टाइम पर हल किया गया और ReferencePathजब प्रोजेक्ट को IDE में लोड किया गया। मुझे वास्तव में यकीन नहीं है कि उस के प्रभाव हालांकि हैं। मैंने देखा है कि वी.एस. कभी-कभी फिर से लिखते हैं .csproj.userऔर मुझे फिर से लिखना पड़ता है ReferencePath, लेकिन मुझे यकीन नहीं है कि इससे क्या होता है।

मैंने सुना है कि यह .csproj.userउपयोगकर्ता-विशिष्ट होने के बाद से फ़ाइल में जांच नहीं करना सबसे अच्छा है , इसलिए मैं इसके लिए लक्ष्य करना चाहता हूं, लेकिन मैंने यह भी सुना है कि HintPath-सीपीएल डीएलएल को लोड होने की "गारंटी" नहीं है वही DLL प्रोजेक्ट के आउटपुट डायरेक्टरी में स्थित है। इस पर कोई विचार?

जवाबों:


133

इस MSDN ब्लॉग के अनुसार: https://blogs.msdn.microsoft.com/manishagarwal/2005/09/28/resolve-file-references-in-team-build-part-2/

निर्माण के समय विधानसभाओं के लिए एक खोज क्रम है। खोज क्रम इस प्रकार है:

  • वर्तमान परियोजना की फाइलें - $ {कैंडिडेटएवाफ़ॉर्म फ़ाइल्स} द्वारा इंगित की गई हैं।
  • $ (ReferencePath) संपत्ति जो .user / लक्ष्य फ़ाइल से आती है।
  • संदर्भ आइटम द्वारा इंगित% (HintPath) मेटाडेटा।
  • लक्ष्य रूपरेखा निर्देशिका।
  • असेंबली में पाए गए निर्देशिकाएँ, जो विधानसभाफॉल्डर्सएक्स पंजीकरण का उपयोग करते हैं।
  • पंजीकृत विधानसभा फ़ोल्डर, $ {विधानसभाफॉल्डर्स} द्वारा इंगित किया गया।
  • $ (OutputPath) या $ (OutDir)
  • GAC

इसलिए, यदि वांछित विधानसभा HintPath द्वारा पाई जाती है , लेकिन एक वैकल्पिक विधानसभा ReferencePath का उपयोग करके पाई जा सकती है , तो यह ReferencePath की विधानसभा को HintPath की d में से एक पसंद करेगी ।


2
सिवाय उन्होंने वीएस २०१ ९ में इसे बदल दिया - हम वर्षों से इस सेटअप का उपयोग कर रहे हैं। अब और नहीं। रिपॉजिटरी फाइलों में अब सॉल्यूशन बिल्ड dll फाइल्स - गो फिगर:
क्रिश्चियन

@ क्रिसियन: रिपॉजिटरी फाइल्स क्या हैं? क्या आपको इस बारे में अधिक जानकारी है?
परीक्षण

@testing मैं बाहरी संदर्भ रास्तों के बारे में बात कर रहा हूं, आप वीएस के अपने प्रोजेक्ट सेटअप में सेट कर सकते हैं। दुर्भाग्य से परियोजना के वातावरण के लिए यह महत्वपूर्ण महत्वपूर्ण सेटिंग (हमारे पास तीन अलग-अलग वातावरण हैं), परियोजना सेटिंग्स को नहीं बचाया जा सकता है; इसलिए आपको इसे स्पष्ट रूप से कमांड लाइन कंपाइल स्क्रिप्ट के पैरामीटर के रूप में जोड़ना होगा।
क्रिश्चियन

31

Microsoft.Common.targets फ़ाइल में देखें

प्रश्न का उत्तर Microsoft.Common.targetsआपके टारगेट फ्रेमवर्क संस्करण के लिए फाइल में है ।

.Net फ्रेमवर्क संस्करण 4.0 ((और 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 फ्रेमवर्क 3.5 के लिए परिभाषा समान है, लेकिन टिप्पणी गलत है। 2.0 की परिभाषा थोड़ी अलग है, यह $ (OutDir) के बजाय $ (OutputPath) का उपयोग करता है।

मेरी मशीन पर मेरे पास 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

यह विंडोज 7 पर स्थापित विजुअल स्टूडियो 2008, 2010 और 2013 के साथ है।

तथ्य यह है कि आउटपुट डायरेक्टरी को खोजा गया है, यह थोड़ा निराशाजनक हो सकता है (जैसा कि मूल पोस्टर बताते हैं) क्योंकि यह एक गलत हिंटपाथ को छिपा सकता है। समाधान आपके स्थानीय मशीन पर ठीक बनाता है, लेकिन जब आप एक साफ फ़ोल्डर संरचना (जैसे निर्माण मशीन पर) में बनाते हैं तो टूट जाता है।


मुझे एक समान समस्या है, इस मामले में, मुझे डीएल फ़ाइलों को कहां रखना चाहिए? फ्रेमवर्क या फ्रेमवर्क 64? stackoverflow.com/questions/45945579/…
चेतन सचदेव

5

मेरा अपना अनुभव रहा है कि दो प्रकार के विधानसभा संदर्भों में से एक से चिपकना सबसे अच्छा है:

  • वर्तमान निर्माण निर्देशिका में एक 'स्थानीय' विधानसभा
  • जीएसी में एक विधानसभा

मैंने पाया है (बहुत कुछ जैसा आपने वर्णित किया है) अन्य तरीके या तो बहुत आसानी से टूट जाते हैं या रखरखाव आवश्यकताओं को परेशान करते हैं।

कोई भी विधानसभा जिसे मैं GAC नहीं करना चाहता, को निष्पादन निर्देशिका में रहना होगा। कोई भी विधानसभा जो निष्पादन निर्देशिका I GAC में नहीं है (स्वचालित बिल्ड ईवेंट द्वारा प्रबंधित) नहीं है।

इससे मुझे अब तक कोई समस्या नहीं हुई है। हालांकि मुझे यकीन है कि ऐसी स्थिति है जहां यह काम नहीं करेगा, किसी भी समस्या का सामान्य उत्तर "ओह, बस जीएसी है!"। 8 घ

उम्मीद है की वो मदद करदे!


1

हालाँकि यह एक पुराना दस्तावेज़ है, लेकिन इससे मुझे 'HintPath' की समस्या को किसी दूसरी मशीन पर नज़रअंदाज़ करने में मदद मिली। इसका कारण यह था कि संदर्भित DLL को स्रोत नियंत्रण में भी होना चाहिए:

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

अंश:

किसी बाहरी-सिस्टम असेंबली को शामिल करना और फिर संदर्भ देना
1. सॉल्यूशन एक्सप्लोरर में, उस प्रोजेक्ट पर राइट-क्लिक करें, जिसे असेंबली को रेफर करना है, और फिर Add मौजूदा आइटम पर क्लिक करें।
2. असेंबली में ब्राउज़ करें और फिर ठीक पर क्लिक करें। विधानसभा को तब प्रोजेक्ट फ़ोल्डर में कॉपी किया जाता है और स्वचालित रूप से वीएसएस में जोड़ा जाता है (यह मानते हुए कि परियोजना पहले से ही स्रोत नियंत्रण में है)।
3. प्रोजेक्ट फ़ोल्डर में असेंबली के लिए फ़ाइल संदर्भ सेट करने के लिए संदर्भ जोड़ें संवाद बॉक्स में ब्राउज़ बटन का उपयोग करें।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.