2012-06-20 31 views
10

मैं एफ # 3.0 प्रकार प्रदाता तंत्र का उपयोग करके "कमजोर" टाइप किए गए डेटा स्रोतों के आधार पर "मजबूत" प्रकार जेनरेट करना चाहता हूं। जेनरेट किए गए प्रकार सी # क्लाइंट्स से ऐसे माहौल में पहुंच योग्य होना चाहिए जहां केवल नेट 4.0 स्थापित है, लेकिन नहीं 4.5। यदि .NET 4.0 संगतता संभव नहीं है, तो हम अपने वर्तमान बड़े पैमाने पर ईआरपी परियोजना में प्रकार प्रदाताओं का उपयोग नहीं कर सकते हैं।सी #-फ्रेंडली कैसे उत्पन्न करें, एफ # 3.0 प्रकार प्रदाताओं का उपयोग कर नेट 4.0 संगत प्रकार

अब तक, मैं MSDN (अनुभाग "जनरेट किया प्रकार प्रदान करना") पर tutorial निम्नलिखित, "ProvidedTypes-0.2.fs" से ProvidedTypeDefinition का उपयोग, जो एफ # 3.0 नमूना का हिस्सा है द्वारा MyGeneratedTypes.dll बनाने में सफल रहा है पैक। (इसे काम करने के लिए, मुझे "ProvidedTypeDefinition.ConvertToGenerated ..." विधि से "File.Delete ..." पंक्ति को हटाना पड़ा था।

MyGeneratedTypes.dll में रनटाइम संस्करण v4.0.30319 है, जो ठीक है (.NET 4.0 का रनटाइम)। मैं MyGeneratedTypes.dll को एक सी #/नेट 4.0 एप्लिकेशन में संदर्भ जोड़ सकता हूं, और इंटेलिसेन्स अपेक्षित प्रकारों और सदस्यों को दिखाता है। हालांकि, जब मैं संकलन करने का प्रयास करता हूं, तो सी # कंपाइलर विफल रहता है और 'चेतावनी MSB3258: प्राथमिक संदर्भ "MyGeneratedTypes" को हल नहीं किया जा सकता क्योंकि यह .NET Framework असेंबली पर एक अप्रत्यक्ष निर्भरता है "FSharp.Core, Version = 4.3.0.0 , संस्कृति = तटस्थ, PublicKeyToken = b03f5f7f11d50a3a "जिसमें वर्तमान लक्ष्य ढांचे में संस्करण" 4.0.0.0 "से उच्च संस्करण" 4.3.0.0 "है। '

आईएल जासूस पर एक नजर पुष्टि करता है कि MyGeneratedTypes.dll में वास्तव में FSharp.Core 4.3 का संदर्भ है, हालांकि यह संदर्भ पूरी तरह से अनावश्यक है। अब तक, मुझे एफ # कंपाइलर को इस संदर्भ को जेनरेटेड असेंबली में डालने से रोकने का कोई तरीका नहीं मिला है। (अन्य चीजों के अलावा, मैंने सी # में शुद्ध नेट 4.0 असेंबली बनाई है और इसे ProvidedTypeDefinition के निर्माता को पास कर दिया है, लेकिन इसका कोई प्रभाव नहीं है)।

क्या किसी को पता है कि कैसे संदर्भ से छुटकारा पाएं, या बी) यदि यह केवल एक एफ # 3.0 रिलीज उम्मीदवार समस्या है, जिसे अंतिम रिलीज में हल किया जाएगा।

संपादित

@Brian के साथ बातचीत समस्या के लिए निम्न "आंशिक" समाधान में बदल गया है: आप संकलन कर सकते हैं एक "। शुद्ध सी #/नेट 4.0" एक साथ एफ # 3.0 पुस्तकालय ग्राहक को संदर्भित उत्पन्न प्रकार, लेकिन केवल .NET 4.0 सी # कंपाइलर (सीएससी) को कॉल करके कमांड लाइन से कॉल करके। यह वीएस 2010 में या MSBuild कमांड लाइन के माध्यम से संकलन करते समय काम नहीं करता है। मुझे संदेह है कि यह निम्न व्यवहार के कारण होता है:

  1. MyGeneratedTypes.dll VS 2012 में F # प्रकार प्रदाता तंत्र के साथ उत्पन्न होता है।
  2. पीढ़ी के दौरान, FSharp.Core 4.3 का संदर्भ निर्भरता के लिए मेटाडेटा में "विशिष्ट संस्करण: सत्य" निर्दिष्ट किए बिना स्वचालित रूप से डाला जाता है (भले ही आवश्यक नहीं है)।
  3. वीएस 2010 में एक सी # क्लाइंट "नेट 4.5-फ्री" सिस्टम संदर्भ MyGeneratedTypes.dll पर संदर्भित करता है।
  4. जब सी # क्लाइंट संकलित किया जाता है, तो एमएसबिल्ड FSharp.Core 4.3 के अप्रत्यक्ष संदर्भ को MyGeneratedTypes.dll के अंदर खोजता है।
  5. क्योंकि अप्रत्यक्ष संदर्भ "विशिष्ट अभिव्यक्ति: झूठी" के साथ मौजूद है, एमएसबिल्ड चेतावनी एमएसबी 3257 उत्सर्जित करता है और सी # कंपाइलर (सीएससी) में प्रत्यक्ष संदर्भ /r:"MyGeneratedTypes.dll "को पारित करने से इनकार करता है। (नोट: एमएसबिल्ड चेतावनियों को किसी भी तरह से दबाया नहीं जा सकता है।)
  6. सी # कंपाइलर (सीएससी) को MSBuild द्वारा /r:"MyGeneratedTypes.dll के बिना बुलाया जाता है "।इसलिए, यह संकलित नहीं कर सकता है, और संकलक त्रुटि CS0246 उत्सर्जित करता है: "प्रकार या नामस्थान नाम 'MyGeneratedTypes' नहीं मिला (...)"।

जहां तक ​​मेरा बता सकते हैं, हम इस समस्या के साथ फंस रहे हैं, जब तक कि एफ # प्रकार प्रदाता तंत्र या तो एक) FSharp.Core 4.3 रेफरी बाहर करने के लिए जब यह एक उत्पन्न विधानसभा में की जरूरत नहीं है संशोधित किया गया है, या बी) मेटाडेटा "SpecificVersion:true" के साथ रेफरी शामिल करने के लिए।

+2

मेरे पास कोई जवाब नहीं है, लेकिन मुझे उत्सुकता है - यदि आप सी # से लाइब्रेरी का उपयोग करने जा रहे हैं तो आप एफ # प्रकार प्रदाताओं का उपयोग क्यों करना चाहते हैं? क्या आप भविष्य में एफ # में जाने की योजना बना रहे हैं? क्योंकि यदि नहीं, तो कोडडॉम या रोज़लिन का उपयोग करके समस्या को हल करने का आसान तरीका हो सकता है। मुझे लगता है कि टाइप प्रदाताओं के अधिकांश मूल्य तब आते हैं जब आप उन्हें F # ... –

+0

@Tomas से उपभोग करते हैं। हम समाधान के गैर-UI भागों में एक अतिरिक्त भाषा के रूप में F # का उपयोग कर रहे हैं जिसमें अधिकतर सी # प्रोजेक्ट शामिल हैं। मैं उम्मीद कर रहा था कि प्रकार प्रदाता एक सीएलआई प्रकार जनरेटर (_F # उद्धरण_ का उपयोग करके और _ProvidedTypeDefinition_ के सुव्यवस्थित एपीआई) का एक सरल तरीका प्रदान करते हैं। अब तक, मुझे वह पसंद है जो मैं देखता हूं, लेकिन यह सी # (अभी तक?) के साथ संकलित नहीं है। सालों से, हम एक स्वयं निर्मित जेनरेटर का उपयोग कर रहे हैं जो सी # स्रोत कोड फाइलें उत्पन्न करता है, जो बनाए रखने में परेशानी है। यदि कोड प्रदाता काम नहीं करते हैं तो मैं कोडडॉम और रोज़लिन में देखूंगा - सुझाव के लिए धन्यवाद। –

उत्तर

6

सी # प्रोजेक्ट में FSharp.Core 4.3.0.0 का संदर्भ जोड़ें (या चेतावनी को अनदेखा करें)। अजीब नंबरिंग सम्मेलन के बावजूद, FSharp.Core 4.3.0.0 .NET 4.5 में किसी भी चीज़ पर निर्भर नहीं है, यह केवल .NET 4.0 पर निर्भर करता है।

+0

मैंने पहले ही यह कोशिश की है। किसी भी तरह से, सी # कंपाइलर दो त्रुटियों को कहता है कि इसे नामस्थान और नाम उत्पन्न असेंबली में प्रकार नहीं मिलता है, हालांकि दोनों सी # इंटेलिसेन्स के माध्यम से पूरी तरह से दिखाई दे रहे हैं (सी # कोडिंग समय पर कोई समस्या नहीं है, केवल सी # संकलन समय पर)। सी # कंपाइलर का एकमात्र अन्य संदेश "आंतरिक एफ # संदर्भ" चेतावनी है, जो आपके उत्तर के अनुसार हानिकारक है। आईएल जासूस में, एफ # संदर्भ को छोड़कर असेंबली सामान्य दिखती है। यदि आंतरिक F # संदर्भ समस्या का मूल कारण नहीं है, तो मुझे नहीं पता कि और क्या हो सकता है ... –

+2

ठीक है, आपको प्राप्त होने वाली वास्तविक कंपाइलर त्रुटियों को साझा करना उपयोगी होगा। तो आप कह रहे हैं कि ildasm/ilspy देखें कि ये सार्वजनिक प्रकार एफ # असेंबली में दिखाई देते हैं, लेकिन किसी कारण से सी # कंपाइलर उन्हें 'नहीं देखता है, भले ही असेंबली csc.exe पर'/r 'के संदर्भ में है कमांड लाइन? – Brian

+0

हां, यही वह है जो मैं कह रहा हूं। सी #/नेट 4.0 क्लाइंट विंडोज 8 पर ठीक काम करता है जहां .NET 4.5 मौजूद है। हालांकि, यह विंडोज 7 पर काम नहीं करता है जहां केवल .NET 4.0 मौजूद है। यहां, सी # कंपाइलर दो संदेशों को जारी करता है: 1) 'त्रुटि CS0246: प्रकार या नामस्थान नाम' MyGeneratedTypes 'नहीं मिला (क्या आप एक प्रयोग निर्देश या असेंबली संदर्भ खो रहे हैं?)', और 2) जैसा कि उल्लेख किया गया चेतावनी प्रश्न। अजीब बात यह है कि विंडोज 7 पर वीएस 2010 के भीतर, सी # इंटेलिसेन्स इस प्रकार को पहचानता है, और सी # आईडीई या रीशेपर द्वारा कोई समस्या नहीं दी जाती है। यह सिर्फ संकलित नहीं करता है। –