2014-10-12 14 views
6

के साथ Roslyn MSBuildWorkspace का उपयोग करें मेरे मास्टर थीसिस के लिए मैं एक विजुअल स्टूडियो प्लगइन बना रहा हूं जो वर्तमान खुले समाधान के कुछ कोड-विश्लेषण करना चाहिए। ऐसा करने के लिए मैंने corresponding nuget package का उपयोग करके Roslyn का उपयोग करने का प्रयास करने का निर्णय लिया है।विजुअल स्टूडियो 2013

'फ़ाइल या विधानसभा लोड नहीं कर सका माइक्रोसॉफ्ट:

सब कुछ जब तक मैं MSBuildWorkspace.Create(). यह आखिरी कॉल निम्न अपवाद का कारण बनता है उपयोग करने के लिए कोशिश की है (कोड, ... नेविगेट करने के लिए SyntaxTree) काम करता है ठीक। बिल्ड, संस्करण = 14.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b03f5f7f11d50a3a 'या इसकी निर्भरताओं में से एक। सिस्टम फ़ाइल निर्दिष्ट नहीं मिल सकता है। ":":

मैं इस दो पोस्ट नहीं मिले

  • MSBuildWorkspace.Create() throws exception
  • जहाँ से मैं समझता हूँ कि मैं दृश्य स्टूडियो 14, जो rel में है के लिए MSBuild उपकरण की जरूरत है एएसडी आईएसओ

    मैं पूर्ण विजुअल स्टूडियो 14 स्थापित नहीं करना चाहता, यह भी क्योंकि प्लगइन जो मैं लिख रहा हूं उसे विजुअल स्टूडियो 2013 के तहत चलाना चाहिए। दो पदों से ऐसा लगता है कि मैं केवल वीएस 14 के इस हिस्से को स्थापित कर सकता हूं।

    मेरा प्रश्न वास्तव में है: यदि मैं विजुअल स्टूडियो 14 के लिए एमएसबिल्ड टूल्स स्थापित करता हूं तो अन्य सभी विजुअल स्टूडियो परियोजनाओं के साथ क्या होगा जो मैं वर्तमान में काम कर रहा हूं? फिलहाल वे विजुअल स्टूडियो 2013 के एमएसबिल्ड टूल का उपयोग करते हैं। अभी भी इसका उपयोग करना संभव है?

    अद्यतन

    क्या मैं acctually पाने के लिए कोशिश कर रहा हूँ यदि किसी विशेष विधि परियोजना के अंदर संदर्भ होते हैं मिल रहा है। विचार this post में आगे बढ़ना था।

    +0

    वीएस के साथ एकीकृत डायग्नोस्टिक्स को वीएस के साथ जोड़ा जा रहा है। ऐसा लगता है कि रोज़लिन को अब वीएस 14 की आवश्यकता है और वीएस 13 पूर्वावलोकन अब समर्थित नहीं है। आप निश्चित रूप से वीएस के साथ-साथ कई संस्करणों को स्थापित कर सकते हैं, लेकिन क्योंकि यह सीटीपी है, हमेशा कुछ ऐसा होता है जो गलत हो सकता है। सामान्य बॉयलरप्लेट: "हालांकि इन सीटीपी को विजुअल स्टूडियो के पुराने संस्करणों के साथ-साथ एक साथ स्थापित करने का इरादा है, फिर भी प्रत्येक सीटीपी की पूर्ण संगतता की गारंटी नहीं है।" –

    +0

    तथ्य यह है कि मैं अलग-अलग वीएस संस्करणों (सामान्य बॉयलरप्लेट के साथ) स्थापित कर सकता हूं, यह मुझे ज्ञात है। तथ्य यह है कि अंत में प्लगइन को विसुअल स्टूडियो 2013 के साथ काम करना चाहिए। यदि, वीएस 2013 के साथ काम करने के लिए, मुझे वीएस 2014 के एमएसबिल्ड को स्थापित करने की आवश्यकता है, जो कि "सामान्य वीएस 2013 परियोजनाओं" का उपयोग तब तक एक समस्या नहीं है जब तक कि पुराना एमएसबिल्ड। – Lando

    +1

    जैसा कि जेसन कहते हैं, आपको VisualStudioWorkspace का उपयोग करना चाहिए और आपको इनमें से कोई भी समस्या नहीं होगी। जैसा कि विजुअलस्टूडियो वर्कस्पेस अनियंत्रित है, मैंने यहां विभिन्न कार्यक्षेत्रों के लिए एक गाइड लिखा है: http://joshvarty.wordpress.com/2014/09/12/learn-roslyn-now-part-6-working-with-workspaces/ – JoshVarty

    उत्तर

    1

    यह entirely possible है, लेकिन यह बिल्कुल आसान नहीं है।

    आपको यह सुनिश्चित करने की ज़रूरत है कि आप कभी भी रोसलीन असेंबली का संस्करण लोड करें जो आपके द्वारा लक्षित वीएस संस्करण में है, अपने वीएसआईएक्स से उन असेंबली को हटाकर और विधानसभा को संभालने के लिए सुनिश्चित करें कि आप सही हैं।
    तुम मेरे कोड है कि वास्तव में here करता है देख सकते हैं, और आप में my blog post

    नोट इस तकनीक के बारे में और अधिक पढ़ सकते हैं कि अगर आप किसी भी इंटरफेस रोसलिन विधानसभाओं में परिभाषित [Export] करने की जरूरत है, इस, सब पर काम नहीं करेगा MEF के बाद से अपने हैंडलर जोड़ने से पहले उन्हें लोड करने का प्रयास करेंगे। (जब तक आप ildasm में हाथ से मॉड्यूल प्रारंभकर्ता नहीं जोड़ते)

    कठिन हिस्सा यह है कि आपको हर रोज़लिन संस्करण में एपीआई के चौराहे पर सीमित करने की आवश्यकता है जिसे आप समर्थन देना चाहते हैं।

    +0

    मैं उस कोड को देखकर परेशान हूं, और इसकी अनुशंसा नहीं कर सकता। हुकिंग असेंबली रिसोलव इसे करने का एक गन्दा तरीका है - और कल्पना करें कि क्या दो एक्सटेंशन ऐसा करने का प्रयास करते हैं, प्रत्येक रोज़लिन के विभिन्न संस्करणों को लोड करने का प्रयास कर रहा है! मुझे पता है कि वे आपके विशेष मामले में अनुपलब्ध हो सकते हैं, लेकिन मैं यह भी इंगित करने के लिए उस कोड में एक टिप्पणी डालूंगा कि अगर किसी को बाध्यकारी रीडायरेक्ट या कुछ चाहिए, तो उसे ऐसा नहीं करना चाहिए और समर्थित तंत्र का उपयोग करना चाहिए। –

    +0

    @ जेसनमालिनोस्की: उस कोड का बिंदु रोसलीन के संस्करण को वीएस के भीतर लोड करना है; Roslyn का एक अलग संस्करण लोड करना एक बुरा विचार है। मुझे वीएस2013 और देव 14 के साथ एक एकल डीएलएल काम करने के लिए मेरे कोड के किसी भी विकल्प के बारे में पता नहीं है। – SLaks

    +0

    लेकिन क्या होता है जब दो लोग ऐसा करते हैं? :-) –

    3

    आप रोज़लिन कोडबेस को फोर्क कर सकते हैं, और MSBUILD12 परिभाषित कर सकते हैं, जिसे अभी भी काम करना चाहिए, हालांकि हम वास्तव में इसका परीक्षण नहीं करते हैं।

    6

    जब आप कहते हैं कि आप विजुअल स्टूडियो के लिए प्लगइन बना रहे हैं, तो यदि आप सभी को वर्तमान में खुले समाधान (यानी उपयोगकर्ता द्वारा संपादित किया जा रहा कोड) के लिए वर्कस्पेस मिल रहा है, तो आपको MSBuildWorkspace का उपयोग नहीं करना चाहिए, वास्तव में कभी भी । विजुअल स्टूडियो के के बाहर चीजें लोड करने के लिए यह एक प्रकार है। यदि आप उत्पाद में हैं तो आप क्या कर सकते हैं एमईएफ [आयात] माइक्रोसॉफ्ट। विज़ुअल स्टूडियो.भाषा सेवा। विज़ुअल स्टूडियो वर्कस्पेस। इससे आपको उपयोगकर्ता के खुलेपन तक लाइव पहुंच मिलती है, और पूरी तरह से एमएसबिल्ड चलाने से बचा जाता है।

    ध्यान दें कि आपको अभी भी संदर्भ संदर्भों की अपनी पसंद के बारे में सावधान रहना होगा: यदि आप नवीनतम NuGet पैकेज का उपयोग करते हैं जो काम नहीं करेंगे क्योंकि वे संस्करण में भिन्न होंगे (और एपीआई - हम भी आखिरी विजुअल स्टूडियो 2013 पूर्वावलोकन में जो कुछ था, उससे सामान का एक गुच्छा बदल गया।

    +0

    विजुअलस्टूडियोवार्स स्पेस का उपयोग करना प्रोजेक्ट प्राप्त करने के लिए संभव है और 'project.GetCompilationAsync()। परिणाम;'? – Lando

    +1

    (कृपया, इस प्रश्न को बेहतर ढंग से समझने के लिए, मेरे मूल प्रश्न का अद्यतन उस अंतिम लक्ष्य के साथ देखें जिसे मैं प्राप्त करने की कोशिश कर रहा हूं।) – Lando

    +0

    @Lando: 'Reses' का उपयोग न करें; 'प्रतीक्षा करें 'का प्रयोग करें। (अन्यथा, आपको डेडलॉक्स और अन्य समस्याएं मिलेंगी) – SLaks

    5

    मुद्दा यह है कि (दुर्भाग्य से) सार्वजनिक Roslyn nuget संकुल में असेंबली MSBuild के एक नए संस्करण के साथ संकलित किया गया है जो आप चाहते हैं।

    हालांकि, यह ठीक करने के लिए बहुत आसान है ताकि यह एमएसबिल्ड 4.0 (वीएस2012 +) पर काम करता है। मैं उन्हें (https://roslyn.codeplex.com/workitem/405 पर) ठीक के साथ एक पीआर के साथ प्रदान की है, लेकिन यह भी एक nuget पैकेज बुलाया DesktopAnalysis कि सी # कोड विश्लेषण करने के लिए सभी विधानसभाओं में शामिल है, VS2012 + पर काम (MSBuild 4.0+) प्रकाशित: https://www.nuget.org/packages/DesktopAnalysis

    इसके बजाए बस एक install-package DesktopAnalysis -pre करें और आप कर चुके हैं। असेंबली समान हैं, कोड एक ही है, आदि

    मैं इसका उपयोग कोड माइग्रेशन एक्सटेंशन प्रदान करने के लिए कर रहा हूं जो VS2013 से VS2015 पूर्वावलोकन तक सभी तरह से काम करता है।

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