.net मैं अपने प्रबंधित NuGet पैकेज समर्थन सी++/सीएलआई परियोजनाओं को कैसे बना सकता हूं?




dll c++-cli (4)

मैंने एक NuGet पैकेज बनाया है जो इसे सी # प्रोजेक्ट से उपयोग करते समय अच्छी तरह से काम करता है। इसमें lib/net40 निर्देशिका में एक डीएलएल है, और डीएलएल संदर्भ के रूप में जोड़ा जाता है।

अब जब NuGet C ++ का समर्थन करता है, तो मैं वास्तव में अपने पैकेज को कैसे संशोधित करूं ताकि डीएलएल को सी ++ / सीएलआई प्रोजेक्ट में प्रबंधित संदर्भ के रूप में जोड़ा जा सके? मुझे यह समझाते हुए कोई ट्यूटोरियल नहीं मिल रहा है। अगर मैं पैकेज को बस जोड़ने की कोशिश करता हूं, तो मुझे निम्न त्रुटि मिलती है:

आप इस पैकेज को एक ऐसे प्रोजेक्ट में स्थापित करने का प्रयास कर रहे हैं जो 'मूल, संस्करण = v0.0' को लक्षित करता है, लेकिन पैकेज में उस ढांचे के साथ संगत किसी असेंबली संदर्भ या सामग्री फ़ाइलों को शामिल नहीं किया गया है।

कोई सोचता है कि समाधान फ़ाइलों को lib / मूल के अंतर्गत रखना है, लेकिन http://docs.nuget.org/docs/reference/support-for-native-projects अनुसार, यह समर्थित नहीं है। साथ ही, सीधे डीएलएल को lib के तहत डालने से कुछ भी नहीं लगता है।

जाहिर है, मुझे इसे .props या .targets फ़ाइल के साथ बिल्ड / मूल के तहत करना है, लेकिन मुझे यह काम करने के लिए उन फ़ाइलों में क्या लगाने की आवश्यकता है?


वास्तव में "नियमित" NuGet संकुल को स्थापित करने और निम्न चरणों का उपयोग करके सी ++ / सीएलआई परियोजनाओं से स्वचालित रूप से संदर्भित करने की संभावना प्रतीत होती है (कम से कम NuGet >= 2.5 ):

  1. अपने प्रोजेक्ट में पैक किए जाने के build\<ProjectName>.targets फ़ाइल को build\<ProjectName>.targets (या संशोधित करें) और इसमें निम्न सामग्री डालें (सुनिश्चित करें कि <AssemblyName> वास्तविक मूल्य के साथ प्रतिस्थापित करें):

    <?xml version="1.0" encoding="utf-8" ?>
    <Project ToolsVersion="4.0"
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- for C++/CLI projects only -->
      <ItemGroup Condition="'$(Language)' == 'C++'">
        <Reference Include="<AssemblyName>">
          <!--
            this .targets file is installed next to the assembly,
            so we do not have to figure out any versions or paths here ourselves
          -->
          <HintPath>
            $(MSBuildThisFileDirectory)..\lib\native\<AssemblyName>.dll
          </HintPath>
        </Reference>
      </ItemGroup>
    </Project>
    
  2. पैक किए गए प्रोजेक्ट के .nuspec में एक या अधिक file प्रविष्टियों को जोड़ने के लिए लक्ष्य मशीन पर lib\native\ निर्देशिका में असेंबली को भी शामिल करें:

    <package>
      <metadata>
        ...
      </metadata>
      <files>
        ...
        <!--
          add a copy of the assembly to lib\native to prevent NuGet
          from complaining about incompatible native projects
        -->
        <file src="bin\$configuration$\$id$.dll" target="lib\native\" />
        <file src="bin\$configuration$\$id$.xml" target="lib\native\" />
    
        <!-- don't forget about the .targets file containing the reference -->
        <file src="build\$id$.targets" target="build\" />
      </files>
      ...
    </package>
    

यहां तक ​​कि यदि NuGet C ++ / CLI प्रोजेक्ट्स में असेंबली संदर्भ नहीं जोड़ता है, तब भी यह किसी पैकेज द्वारा प्रदान की गई किसी भी .props और .targets फ़ाइलों को सम्मिलित करता है। और चरण 1 से कस्टम लक्ष्य हमारी पैक की गई असेंबली का संदर्भ जोड़ देगा।

जहां तक ​​मैं इसे देख सकता था, इस समाधान का एक दोष यह है कि इस तरह से जोड़ा गया संदर्भ Commpon Properties/Framework and References सी ++ / सीएलआई प्रोजेक्ट के Commpon Properties/Framework and References अनुभाग में प्रदर्शित नहीं होता है। अन्य भी हो सकते हैं, इसलिए इसे अपने जोखिम पर उपयोग करें ...


प्रमाण पत्र वास्तव में मशीनकी के साथ एन्क्रिप्ट किए जाते हैं जहां पैकेज स्रोत जोड़ा गया था। सादे टेक्स्ट संस्करण का उपयोग किए बिना, setApiKey कमांड को शायद निर्माण के हिस्से के रूप में चलाया जाना चाहिए।


इंस्टॉलर सी # स्टार्टअप प्रोजेक्ट में खुद को संदर्भ जोड़ने का प्रयास करता है। स्थापित करने से पहले समाधान में स्टार्टअप प्रोजेक्ट को सी # प्रोजेक्ट बनाएं। यदि आपके पास कोई नहीं है तो एक डमी सी # प्रोजेक्ट बनाएं


जैसा कि पैट्रिक ओहारा ने लिखा था , NuGet आपके लिए सी ++ / सीएलआई प्रोजेक्ट में बदलाव नहीं करेगा। गिटहब इश्यू नुगेट / होम # 1121 देखें - प्रबंधित पैकेज को एक सीएलआई प्रोजेक्ट में इंस्टॉल नहीं किया जा सकता है । हालांकि, NuGet कमांड लाइन उपयोगिता, NuGet.exe का उपयोग करके, आप NuGet डाउनलोड कर सकते हैं और वांछित पैकेज को अनपैक कर सकते हैं।

एक पूर्ण उदाहरण के लिए, यहां एक चरण स्टूडियो 2013 सी ++ / सीएलआई प्रोजेक्ट में OptimizedPriorityQueue प्रिरिटीक्यूयू 1.0.0 का संदर्भ जोड़ने के लिए मैंने कदम उठाए थे:

  1. पैकेज प्रबंधक कंसोल खोलें यदि पहले से नहीं खुलता है ( टूल> NuGet पैकेज प्रबंधक> पैकेज प्रबंधक कंसोल )।
  2. पैकेज प्रबंधक कंसोल में, NuGet.CommandLine पैकेज स्थापित करें:

    Install-Package NuGet.CommandLine
    

    (नोट: इस लेखन के अनुसार, NuGet.CommandLine का नवीनतम संस्करण 2.8.6 है। यह आपके लिए अलग हो सकता है।)

  3. अपने प्रोजेक्ट फ़ोल्डर में, अब निम्न सामग्री के साथ .nuget\packages.config XML फ़ाइल होना चाहिए:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="NuGet.CommandLine" version="2.8.6" />
    </packages>
    
  4. नोटपैड ++ जैसे टेक्स्ट एडिटर में, वांछित पैकेज के लिए <package> तत्व जोड़ें। इस मामले में, मैंने जोड़ा:

    <package id="OptimizedPriorityQueue" version="1.0.0" />
    

    .. <packages> तत्व के भीतर।

  5. एक कमांड प्रॉम्प्ट खोलें (मैंने एक वीएस2013 डेवलपर कमांड प्रॉम्प्ट खोला, लेकिन एक नियमित कमांड प्रॉम्प्ट काम करना चाहिए।)

  6. परियोजना फ़ोल्डर में cd
  7. यदि निम्न हो तो NuGet.CommandLine की संस्करण संख्या को बदलकर निम्न आदेश चलाएं:

    .\packages\NuGet.CommandLine.2.8.6\tools\NuGet.exe Install -NonInteractive -OutputDirectory packages .nuget\packages.config
    

    मेरे लिए, आउटपुट था:

    Installing 'OptimizedPriorityQueue 1.0.0.0'.
    Successfully installed 'OptimizedPriorityQueue 1.0.0.0'.
    All packages listed in packages.config are already installed.
    
  8. विजुअल स्टूडियो में प्रोजेक्ट पर राइट क्लिक करें और गुण चुनें। सामान्य गुणों के तहत > संदर्भ , नया संदर्भ जोड़ें ... बटन पर क्लिक करें।
  9. बाईं ओर ब्राउज़ करें का चयन करें । संदर्भ जोड़ें संवाद के ठीक ठीक है और रद्द करें बटन के आगे, एक ब्राउज़ ... बटन है। फ़ाइल चयन संवाद खोलने के लिए उस पर क्लिक करें।
  10. डीएलएल पर नेविगेट करें कि NuGet आपके प्रोजेक्ट फ़ोल्डर के उप-निर्देशिका को packages किया गया packages और जोड़ें बटन पर क्लिक करें। संदर्भ जोड़ें संवाद बंद करने के लिए ठीक क्लिक करें।
  11. अब आप अपने सी ++ / सीएलआई परियोजना में असेंबली का उपयोग करने में सक्षम होना चाहिए:

    using namespace Priority_Queue;
    
    //...
    




nuget-package