का उपयोग करते हुए 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 होगा)।