हमारे कोड बेस के हिस्से में, लाइब्रेरी का एक बड़ा हिस्सा एफ # में किया जाता है और शेष सी # में किया जाता है। एफ # और सी # कोड दोनों सामने आ रहे हैं।
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
तब भीतर सी # मॉड्यूल, मैंने कुछ कोड लिखा है जो क्लास को खोजने के लिए प्रतिबिंब का उपयोग करके एफ # रजिस्ट्रार को तत्काल बनाता है (क्योंकि मेरे कोड बेस में सी # कोड पहले बनाता है और यह नहीं जानता कि एफ # कोड बिल्कुल है)। यह बहुत गलती जांच के साथ बदसूरत कोड है, लेकिन यह काम करता है।
क्या आपको कोई जवाब मिला है? –
अंत में मैंने ILMerge का उपयोग करने का निर्णय लिया है। तो दुर्भाग्य से मेरे पास सफलतापूर्वक F # और C# असेंबली विलय करने का उत्तर नहीं है। – Domas