2012-01-03 13 views
6

सारांश:प्रोजेक्ट फ़ाइलों में <ProjectReference> का उपयोग कब करें?

परियोजनाओं दृश्य स्टूडियो के साथ गलत क्रम में निर्माण और # परियोजनाओं सी ++ और सी में कामयाब

विवरण:

मैं एक बड़े पैमाने पर (100 + परियोजनाओं) समाधान फ़ाइल है कि बनाने जा रहा है है गलत आदेश में कुछ परियोजनाएं। समाधान फ़ाइल परियोजनाओं के निम्नलिखित प्रकार शामिल हैं:

  • देशी C/C++
  • प्रबंधित सी ++
  • प्रबंधित C#

समाधान परियोजनाओं के विभिन्न प्रकार के बीच सभी उचित निर्भरता में शामिल है। ठीक है, इसलिए जब मैं कमांड लाइन (MSBuild का उपयोग करके) से बना हूं, तो एक समस्या है। प्रबंधित परियोजनाओं (सी ++ और सी # दोनों) के लिए निर्भरता गलत क्रम में बनाई गई है। उदाहरण के लिए एक परियोजना निर्माण में असफल हो जाएगी क्योंकि एक प्रबंधित निर्भरता गुम है।

#using <foo.dll> 

के बाद से foo.dll अभी मौजूद नहीं है: उदाहरण के लिए एक प्रबंधित सी ++ फ़ाइल एक घोषणा का उपयोग कर कि असफल हो जायेगी होगा।

जिसका अर्थ है कि foo.dll पहले बनाया गया था, लेकिन नहीं था। जैसा कि मैंने पहले उल्लेख किया था, निर्भरता समाधान फ़ाइल में निर्भरताएं स्थापित की गई हैं। उदाहरण के लिए, यदि foo baz पर निर्भर करता है, मैं इस समाधान फ़ाइल में है ...

Project("{C4ABA494-43D0-400A-9917-20E167A12CFD}") = "Foo", "...\Foo.vcxproj", "{5A42640E-9E0A-442B-8A40-AA91AD5444AC}" 
    ProjectSection(ProjectDependencies) = postProject 
     ... 
     {2CE32AE0-B129-40BA-B06E-A628FA149AB3} = {2CE32AE0-B129-40BA-B06E-A628FA149AB3} 
    EndProjectSection 
EndProject 
... 
Project("{C4ABA494-43D0-400A-9917-20E167A12CFD}") = "baz", "...\baz.csproj", "{2CE32AE0-B129-40BA-B06E-A628FA149AB3}" 
    ProjectSection(ProjectDependencies) = postProject 
     ... 
    EndProjectSection 
EndProject 

तो समाधान फ़ाइल सही निर्भरता है। लेकिन Foo.vcxproj प्रोजेक्ट में निर्भरता केवल #using निर्देश द्वारा व्यक्त की जाती है। मैंने विजुअल स्टूडियो ब्लॉग पर पढ़ा है कि एमएसबिल्ड में परियोजनाओं को ऑर्डर करने में एक ज्ञात बग है। http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx

उनके आसपास काम इस तरह, एक आइटम अपनी परियोजनाओं के लिए बुलाया जोड़ने के लिए है:

<ProjectReference Include="... foo.csproj"> 
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
</ProjectReference> 

फिर भी, मेरे सवाल है: मैं सिर्फ अपने प्रबंधित सी ++ परियोजनाओं के लिए यह करने के लिए की जरूरत है? या मैं इसे प्रबंधित सी ++ और सी # परियोजनाओं के लिए करता हूं? (मुझे विश्वास है कि मुझे सी # परियोजनाओं के लिए ऐसा करने की आवश्यकता नहीं है क्योंकि उनकी निर्भरता स्पष्ट हैं)

नोट: मैंने इसे अपने निर्माण में सभी परियोजनाओं पर डालने का प्रयास किया है, और यह इतना गर्म काम नहीं करता है, के रूप में मैं अपने मूल परियोजनाओं में अजीब निर्माण त्रुटियों के बहुत सारे ...

इस के लिए किसी भी प्रतिक्रिया के लिए धन्यवाद मिला है।

उत्तर

4

मैं एक ही मुद्दा था, लेकिन सी # परियोजनाओं के साथ ही। ऐसा लगता है जैसे एमएसबिल्ड समाधान फ़ाइल निर्भरताओं का उपयोग नहीं कर रहा है। यह बिल्ड ऑर्डर बनाने के लिए प्रोजेक्ट फाइलों के अंदर प्रोजेक्ट संदर्भों का उपयोग कर रहा है। सही निर्माण आदेश प्राप्त करने के लिए अपने सभी ProjectReferences अद्यतन करने के लिए प्रयास करें। आपके मामले में आप अपने सी ++ प्रोजेक्ट फ़ाइल में कामयाब परियोजना संदर्भ (निर्भरता) जोड़ने के लिए है।

जवाब आपके सवाल का है: हाँ, तुम दोनों प्रबंधित सी ++ और सी # परियोजनाओं के लिए यह करना है।SLN फाइल के अंदर निर्भरता की स्थापना के लिए पर्याप्त है, तो आप MSBuild के साथ निर्माण कर रहे हैं नहीं है।

+0

मैंने पाया है कि अगर मैं जोड़ने के एक देशी पुस्तकालय से जोड़ने के लिए एक ProjectReference तत्व, कि मैं MSBuild लिपियों के गहरे अंदर त्रुटियों का निर्माण। तो मैं मेरे सभी प्रबंधित सी ++ परियोजनाओं के लिए, एक ProjectReference जोड़ने, अन्य .csproj फ़ाइलों के साथ शुरू कर दिया है। अब मैं उन्हें अपने .csproj फ़ाइलों को जोड़ सकते हैं और देखें कि यह कैसे हो जाता है जाएगा। –

संबंधित मुद्दे