c# - एफ#असेंबली संदर्भ निर्माण मुद्दों के कारण?




visual-studio-2012 f# (2)

हमारे पास एक एफ # असेंबली ( AssemblyOne ) है जो एक एकल विजुअल स्टूडियो 2012 समाधान में एक और एफ # असेंबली ( AssemblyTwo AssemblyOne ) का संदर्भ देता है। MyCSharpLib सी # डीएलएल ( MyCSharpLib ) का संदर्भ है।

असेंबलीऑन में परिभाषित एक समारोह AssemblyOne में परिभाषित एक समारोह को बुलाता है:

namespace AssemblyOne

[<RequireQualifiedAccess>]
module MyModuleA =
    let FetchResult id =
        let result = AssemblyTwo.MyModuleC.FetchResult id
        result

FetchActualResult() में बुलाया गया फ़ंक्शन एक ही असेंबली में एक और फ़ंक्शन ( FetchActualResult() ) को MyCSharpType करता है जो संदर्भित C # DLL ( MyCSharpLib ) से संबंधित MyCSharpType प्रकार का पैरामीटर लेता है:

namespace AssemblyTwo

[<RequireQualifiedAccess>]
module MyModuleB  =
    let FetchActualResult(myCSharpType:MyCSharpLib.MyCSharpType, id:int)
        //return a result

[<RequireQualifiedAccess>]
module MyModuleC =
    let FetchResult id =
        let myCSharpType = new MyCSharpLib.MyCSharpType()
        MyModuleB.FetchActualResult(myCSharpType, id)

समाधान विजुअल स्टूडियो में संकलित और बनाता है; हालांकि, जब हम MSBuild का उपयोग कर कमांड लाइन से प्रोजेक्ट बनाने का प्रयास करते हैं, तो msbuild.log में निम्न त्रुटि के साथ बिल्ड विफल रहता है:

error FS0074: The type referenced through 'MyCSharpLib' is defined in an assembly that is not referenced. You must add a reference to assembly 'MyCSharpLib'.

ऐसा लगता है कि MyCSharpLib में FetchActualResult() फ़ंक्शन हस्ताक्षर में FetchActualResult() से पैरामीटर के रूप में उजागर किया गया प्रकार त्रुटि उत्पन्न कर रहा है। MyCSharpLib को अब MyCSharpLib संदर्भ की आवश्यकता है, भले ही MyCSharpLib सीधे MyCSharpLib से कुछ भी उपयोग न MyCSharpLib । अगर हम फ़ंक्शन हस्ताक्षर से पैरामीटर को हटाते हैं तो समाधान में कोई त्रुटि नहीं होती है।

हमने निम्नलिखित उपयोग मामलों के साथ कोड को दोहराने के द्वारा इस समस्या का और पता लगाया है ('->' असेंबली संदर्भ इंगित करता है):

  • एफ # MyCSharpLib -> एफ # AssemblyTwo -> MyCSharpLib (सी # डीएलएल) (निर्माण नहीं करता है)
  • एफ # MyFSharpLib -> एफ # AssemblyTwo -> MyFSharpLib (एफ # डीएलएल) (निर्माण नहीं करता है)
  • एफ # AssemblyOne -> एफ # AssemblyTwo -> सी # AssemblyThree (उसी समाधान में असेंबली) (निर्माण नहीं करता)
  • एफ # AssemblyOne -> एफ # AssemblyTwo -> एफ # AssemblyThree (उसी समाधान में असेंबली) (बनाता है)

क्या यह व्यवहार समझाया जा सकता है?


मैंने अभी इस तरह एक समान मामला हल किया है। इसे इस्तेमाल करे।

MyModuleC के अंत में, इस पंक्ति को जोड़ें:

let fetchResult = FetchResult

और फिर, MyModuleA में, FetchResult के बजाय fetchResult पर कॉल करें। निश्चित रूप से तर्क के साथ।

हाँ, मुझे पता है कि यह मूर्खतापूर्ण लगता है, लेकिन कोशिश करो। मेरा मानना ​​है कि यह अवांछित निर्भरता को तोड़ देगा।

यदि आप सी # से असेंबली टवो का उपयोग करते हैं, तो शायद आपके पास यह समस्या नहीं होगी। यह तब होता है जब आप एफ # से असेंबली ट्यू का उपभोग करते हैं, इसलिए मुझे आश्चर्य है कि एफ # कंपाइलर के साथ कोई समस्या है या शायद मेरे पास है जो मेरे बाहर है जो करीबी के साथ कुछ करने के लिए है। वैसे भी, मैं चाहता हूं कि एफ # कंपाइलर स्मार्ट हो। हो सकता है कि किसी को एक समस्या दर्ज करनी चाहिए, जब तक कि यह पहले से ही नहीं हो जाती है।


यह मानते हुए कि आपके स्रोतों में एक टाइपो है क्योंकि डीडब्ल्यू राइट ने इंगित किया है, मैं कहूंगा कि यह त्रुटि केवल इस तथ्य से उत्पन्न हो सकती है कि इस कोड से आप बाहरी प्रकार MyCsharpType के उजागर विधि पैरामीटर के साथ एक स्थिर वर्ग MyModuleB को परिभाषित करते हैं।

इस प्रकार Fsharp कोड आईएल में अनुवाद करता है (ILSpy से - retranslated से csharp):

...
public static class MyModuleB
{
    public static string FetchActualResult(MyCSharpType myCSharpType, int id)
    {
        return myCSharpType.Fetch(id);
    }
}

यदि आप इस प्रकार का पर्दाफाश नहीं करते हैं ताकि यह स्थिर रूप से दिखाई दे, तो त्रुटि प्रकट नहीं हो सकती है। हालांकि, यह संकलक के कार्यान्वयन पर निर्भर करेगा।

मैं कल्पना कर सकता हूं कि MyModuleA के संकलन के दौरान, संकलन प्रक्रिया या कंपाइलर के संस्करण की एक कॉन्फ़िगरेशन MyModuleB को "स्पर्श" करने का प्रयास कर सकती है, और इस प्रकार अपरिवर्तित पैरामीटर प्रकार तक पहुंचने का प्रयास कर सकती है, और अन्य शायद MyModuleB को स्पर्श नहीं कर सकता है। निर्भर करता है।

तो समस्या यह है कि मुझे संकलन प्रक्रिया में नहीं है, लेकिन वास्तव में, आप उस प्रकार के उपयोग का पर्दाफाश करते हैं जिसके लिए आप इसकी असेंबली का संदर्भ नहीं देते हैं।






msbuild