2012-12-17 7 views
5

मेरे पास कई एफ # और सी # परियोजनाओं के साथ एक समाधान है। मेरा लक्ष्य आईएलएमर्ज का उपयोग करके उन्हें सभी पुस्तकालयों में विलय करना है। मर्ज किए गए डीएल का नतीजा एक NuGet पैकेज में रखा जाएगा और अन्य परियोजनाओं में संदर्भित किया जाएगा। हालांकि, मैं कुछ मुद्दों में भाग रहा हूं जब विलय डीएल को एफ # परियोजनाओं में संदर्भित किया गया है।आईएलएमर्ज के साथ एफ # और सी # असेंबली कैसे विलय करें ताकि संदर्भित होने पर सभी प्रकार उपलब्ध हों?

मेरी समस्या यह है कि यदि आईएलएमर्ज को दी गई प्राथमिक असेंबली एफ # है तो एफ # प्रोजेक्ट में परिणामी डीएल का संदर्भ केवल एफ # प्रकारों तक पहुंचने की अनुमति देता है। यदि सी # डीएल को विलय के लिए प्राथमिक असेंबली के रूप में चुना जाता है तो F # प्रोजेक्ट में संदर्भित करते समय मर्ज किए गए F # असेंबली से एक्सटेंशन विधियां उपलब्ध नहीं थीं। संलग्न नामस्थान खोलते समय AutoOpen विशेषता के साथ मॉड्यूल को अब खुले तौर पर खोला नहीं गया था।

क्या F # और C# असेंबली मर्ज करने का कोई तरीका है ताकि सभी प्रकार (एक्सटेंशन विधियों सहित) उपलब्ध हों?

+0

क्या आपको कोई जवाब मिला है? –

+0

अंत में मैंने ILMerge का उपयोग करने का निर्णय लिया है। तो दुर्भाग्य से मेरे पास सफलतापूर्वक F # और C# असेंबली विलय करने का उत्तर नहीं है। – Domas

उत्तर

4

हमारे कोड बेस के हिस्से में, लाइब्रेरी का एक बड़ा हिस्सा एफ # में किया जाता है और शेष सी # में किया जाता है। एफ # और सी # कोड दोनों सामने आ रहे हैं।

echo merging %mergeapp% /keyfile:"%keyfile%" /target:library /attr:"%dstpath%%csharpdll%" /targetplatform:%targetplatform%,%targetlib% /lib:%sllib% /lib:%targetlib% /lib:"%libpath%lib" /out:"%mergedpath%..\%csharpdll%" "%dstpath%%csharpdll%" "%dstpath%%fsharpdll%" 
%mergeapp% /keyfile:"%keyfile%" /target:library /attr:"%dstpath%%csharpdll%" /targetplatform:%targetplatform%,%targetlib% /lib:%sllib% /lib:%targetlib% /lib:"%libpath%lib" /out:"%mergedpath%..\%csharpdll%" "%dstpath%%csharpdll%" "%dstpath%%fsharpdll%" 

और है कि हम क्या चाहते हैं करता है:

हम और mergeing का ख्याल है कि मैं क्या देख लेने के लिए एक नारकीय बैच फ़ाइल है कि हम इस कोड के साथ विलय कर रहे हैं। हालांकि, हम किसी भी एक्सटेंशन विधियों को प्रकाशित नहीं करते हैं और न ही हम कोई ऑटो ओपन करते हैं। हमने जो खोजा वह एफ # कंपाइलर में एक बग था, जब तक हमने मिश्रण में obfuscation डालना शुरू नहीं किया, हमें F # असेंबली पर ildasm चलाने और अपमानजनक कोड को बाहर निकालने की आवश्यकता थी। दूसरा मुद्दा यह है कि एफ # सदस्यों पर संरक्षित संशोधक का उचित समर्थन नहीं करता है (एफ # उन्हें सार्वजनिक बनाता है) इसलिए हमने एक विशेषता बनाई जिसे हम संरक्षित करने वाले वर्ग के सदस्यों पर लटका सकते थे। फिर हमने एक उपकरण लिखा जो असेंबली को अलग करने के लिए सेसिल का उपयोग करता है, हमारी विशेषता को मिटा देता है और उन सदस्यों तक पहुंच को सुरक्षित रखता है (code is in the accepted answer here)।

मैं AutoOpen के बारे में पता नहीं था, लेकिन मैं एक ऐसी ही काम करना था, इसलिए मैं वर्ग एक रजिस्ट्रार है कि इस तरह के काम उस तरह किया था बुलाया बनाया: एक स्थिर निर्माता में

type FSharpRegistrant() = 
    do 
     // do whatever I need to get going 

तब भीतर सी # मॉड्यूल, मैंने कुछ कोड लिखा है जो क्लास को खोजने के लिए प्रतिबिंब का उपयोग करके एफ # रजिस्ट्रार को तत्काल बनाता है (क्योंकि मेरे कोड बेस में सी # कोड पहले बनाता है और यह नहीं जानता कि एफ # कोड बिल्कुल है)। यह बहुत गलती जांच के साथ बदसूरत कोड है, लेकिन यह काम करता है।

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