का उपयोग करते हुए Copy
लक्ष्यों को फ़ाइल में लक्ष्य कॉपी करने के लिए आवश्यक पुस्तकालयों अन्य परियोजनाओं जो इस परियोजना का संदर्भ, एक में जिसके परिणामस्वरूप के लिए उन फ़ाइलों की प्रतिलिपि नहीं होंगे DllNotFoundException
। यह एक बहुत ही सरल लक्ष्य फ़ाइल के साथ किया जा सकता है, हालांकि, एक None
तत्व का उपयोग करते हुए , क्योंकि MSBuild सभी None
फाइलों को संदर्भित परियोजनाओं में कॉपी करेगा ।
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<NativeLibs Include="$(MSBuildThisFileDirectory)**\*.dll" />
<None Include="@(NativeLibs)">
<Link>%(RecursiveDir)%(FileName)%(Extension)</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
build
आवश्यक देशी पुस्तकालयों के साथ नगेट पैकेज की निर्देशिका में लक्ष्य फ़ाइल जोड़ें । लक्ष्य फ़ाइल dll
में निर्देशिका की सभी बाल निर्देशिकाओं में सभी फ़ाइलें शामिल होंगी build
। इसलिए एक प्रबंधित असेंबली द्वारा उपयोग किए गए एक देशी पुस्तकालय के संस्करण x86
और x64
संस्करण को जोड़ने के लिए आप Any CPU
निम्नलिखित के समान निर्देशिका संरचना के साथ समाप्त होंगे:
- निर्माण
- 86
- NativeLib.dll
- NativeLibDependency.dll
- 64
- NativeLib.dll
- NativeLibDependency.dll
- MyNugetPackageID.targets
- lib
निर्मित होने पर परियोजना के आउटपुट निर्देशिका में समान x86
और x64
निर्देशिकाएं बनाई जाएंगी। यदि आपको उपनिर्देशिका की आवश्यकता नहीं है, तो **
और %(RecursiveDir)
हटाया जा सकता है और इसके बजाय build
सीधे निर्देशिका में आवश्यक फ़ाइलों को शामिल करें । अन्य आवश्यक सामग्री फ़ाइलों को भी उसी तरह से जोड़ा जा सकता है।
None
विज़ुअल स्टूडियो में खुलने पर लक्ष्य फ़ाइल में जोड़ी गई फ़ाइलें प्रोजेक्ट में नहीं दिखाई देंगी। अगर आप सोच रहे हैं कि मैं Content
फ़ोल्डर का उपयोग nupkg में क्यों नहीं कर रहा हूं, क्योंकि इसमें पॉवरशेल स्क्रिप्ट का उपयोग किए बिनाCopyToOutputDirectory
तत्व सेट करने का कोई तरीका नहीं है (जो केवल विजुअल स्टूडियो के अंदर चलाया जाएगा, कमांड प्रॉम्प्ट से नहीं, बिल्ड सर्वर पर या में अन्य IDEs, और project.json / xproj DNX परियोजनाओं में समर्थित नहीं है ) और मैं परियोजना के भीतर फ़ाइलों की एक अतिरिक्त प्रतिलिपि होने के बजाय फ़ाइलों का उपयोग करना पसंद करता हूं ।Link
अद्यतन:
हालांकि यह भी इसके साथ काम करना चाहिए Content
बल्कि None
यह प्रतीत होता है कि एमएसबिल्ट में एक बग है, इसलिए फ़ाइलों को संदर्भित परियोजनाओं में एक से अधिक चरण हटाए जाने पर कॉपी नहीं किया जाएगा (जैसे proj1 -> proj2 -> proj3, proj3 फाइलें नहीं मिलेंगी proj1 के NuGet पैकेज से लेकिन proj2 होगा)।