2011-10-27 17 views
5

हमने एक .NET असेंबली विकसित की है जो भाषा अनुवाद जानकारी संग्रहीत करती है और इसे वीबी 6 एप्लिकेशन द्वारा उपभोग करने की आवश्यकता होती है।मैं एक .NET असेंबली के लिए बाइनरी संगतता कैसे संरक्षित करूं जो एक COM इंटरफ़ेस प्रस्तुत करता है?

हम आवेदन को पुन: संकलित किए बिना अनुवाद जानकारी को बदलने में सक्षम होना चाहते हैं।

अनुवाद भाषा-सेवा नामक दो-फ़ाइल आंशिक वर्ग द्वारा प्रदान किया जाता है।

एक फ़ाइल गैर-बदलती लाइब्रेरी विधियां है, दूसरा एक resx फ़ाइल से सभी ऑटो जेनरेटेड गुण हैं और regx भाषा अनुवाद जानकारी के डेटाबेस से उत्पन्न होता है।

यह सब अनुवादों का केंद्रीय डेटाबेस रखने की आवश्यकता से उत्पन्न हुआ जो प्रोग्राम के रूप में "फ़्लैट" हो सकता है जिसे हमारे प्रत्येक अलग-अलग अनुप्रयोगों द्वारा उपभोग किया जा सकता है।

अब, मैं इसे छोड़कर और इसे अलग तरीके से कर कर इस समस्या को हल कर सकता हूं। असल में मैं केवल संपत्तियों की स्वत: जेनरेट की गई सूची से छुटकारा पा सकता हूं और समस्या दूर हो जाएगी।

हम डेटाबेस के लिए नया अनुवाद लेबल जोड़ है (इस शब्द में इस शब्द है कि शब्द हो जाता है) यह करने के लिए नए गुणों को जोड़ता है:

क्या मुझे इसमें रुचि है कि कैसे मैं इस समस्या है, जो इस प्रकार है हल कर सकते हैं है वर्ग, जो बदले में COM इंटरफेस में नए खुला गुण जोड़ता है।

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

यहाँ आईडीएल है:

यहाँ निर्माण प्रक्रिया द्वारा उत्पन्न आईडीएल फ़ाइलों की जोड़ी है।

:

http://pastebin.com/K2MuqtYV

सटीक अंतर यह थोड़ा बीच में shoved हो जाता है:

http://pastebin.com/qPvcUV9z

और यहाँ आईडीएल के बाद एक नया संपत्ति जोड़ दिया गया है और अनुकूलता टूट गया है

[id(0x60020039), propget] 
HRESULT Jn_ExactCaseMatch([out, retval] VARIANT_BOOL* pRetVal); 
[id(0x6002003a), propget] 
HRESULT Jn_Regex([out, retval] VARIANT_BOOL* pRetVal); 
[id(0x6002003b), propget] 
HRESULT Jn([out, retval] BSTR* pRetVal); 

और I सोचें यह समस्या है एम, यह तरीकों का क्रम बदल गया है। मैंने सोचा था कि आदेश को स्पष्ट रूप से परिभाषित करने DispID (आपको लगता है कि सब कुछ देख सकते HRESULT Culture([in] ICultureInfo* pRetVal); बाद यहां सी # कोड है कि लिखा है/उत्पन्न है एक आईडी से 0.

शुरू कर दिया है से द्वारा ओवरराइड किया जा सकता है: ILanguageServices.cs: ऑटो उत्पन्न इंटरफ़ेस।

[Guid("547a7f6e-eeda-4f77-94d0-2dd24f38ba58")] 
public partial interface ILanguageServices 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Offence_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Offence_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string Offence { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Colour_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Colour_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string Colour { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DebtManagementSystem_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DebtManagementSystem_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string DebtManagementSystem { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DateOfContravention_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DateOfContravention_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string DateOfContravention { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean ContraventionDetails_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean ContraventionDetails_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string ContraventionDetails { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Income_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Income_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string Income { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Hold_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Hold_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string Hold { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean CivilEnforcementOfficer_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean CivilEnforcementOfficer_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string CivilEnforcementOfficer { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean PCNDebt_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean PCNDebt_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string PCNDebt { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean OnHold_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean OnHold_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string OnHold { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DatePutOnHold_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DatePutOnHold_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string DatePutOnHold { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean HoldCode_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean HoldCode_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string HoldCode { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DateHoldExpires_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean DateHoldExpires_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string DateHoldExpires { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean PutOnHoldByUserName_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean PutOnHoldByUserName_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string PutOnHoldByUserName { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean CurrentState_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean CurrentState_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string CurrentState { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Vrm_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean Vrm_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string Vrm { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean State_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean State_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string State { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean CurrentStatechangedd2d2d4_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean CurrentStatechangedd2d2d4_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string CurrentStatechangedd2d2d4 { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean SimonTest_ExactCaseMatch { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    System.Boolean SimonTest_Regex { get; } 

    /// <summary> 
    /// 
    /// </summary> 
    string SimonTest { get; } 
} 

ILanguageServices_Static।सीएस: इंटरफ़ेस

public partial interface ILanguageServices 
{ 
    [DispId(0)] 
    ICultureInfo Culture { get; set; } 
    [DispId(1)] 
    IResourceManager ResourceManager { get; } 
    [DispId(2)] 
    ICultureInfo[] GetCultures(System.Globalization.CultureTypes enCultureTypes); 
    [DispId(3)] 
    ICultureInfo GetCultureInfo(int LCID); 
    [DispId(4)] 
    ICultureInfo CurrentCulture { get; } 
    [DispId(5)] 
    string TranslateString(string rawString, bool searchInsideString); 
    [DispId(6)] 
    string TranslateString(string rawString); 
} 

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

भले ही कोई मुझे बताए कि यह क्यों काम नहीं कर रहा है और COM इंटरफ़ेस पर कड़े नियंत्रण को कैसे बनाए रखा जाए? विधियों को कड़ाई से क्रमबद्ध करने के लिए बस ऐसा लगता है ... bleugh।

धन्यवाद,

जे 1 एम।

+2

[DispId] केवल तभी काम करता है जब क्लाइंट कोड देर से बाइंडिंग का उपयोग कर रहा हो। स्पष्ट रूप से यह नहीं है। यह COM की एचिलीस एड़ी है, वी-टेबल ऑर्डरिंग महत्वपूर्ण है। [Guid] बदलना सबसे अच्छा है। –

उत्तर

2

C# Langauge Specification Version 4 धारा 10.2.6

एक प्रकार के भीतर सदस्यों के आदेश से शायद ही कभी सी # कोड के लिए महत्वपूर्ण है, लेकिन महत्वपूर्ण हो सकता है जब अन्य भाषाओं और वातावरण के साथ इंटरफ़ेस। इन मामलों में, कई हिस्सों में घोषित एक प्रकार के सदस्यों के आदेश को अनिर्धारित किया गया है।

तो वहाँ एक प्रकार के सदस्यों के आदेश, जिस क्रम में वे घोषित किया गया है के अलावा अन्य को नियंत्रित करने के ग # laguage में कोई प्रावधान नहीं है। एक प्रकार में जिसे आंशिक रूप से घोषित किया गया है, तो आदेश पूर्ण रूप से अपरिभाषित है।

तो यहां निष्कर्ष इंटरफ़ेस के लिए आंशिक घोषणाओं का उपयोग नहीं करता है जिसे आप COM को बेनकाब करने जा रहे हैं। इंटरफ़ेस सदस्य आदेश को नियंत्रित करने का कोई तरीका नहीं है, और चूंकि भाषा में इसे अपरिभाषित करने के बाद परिणामस्वरूप सदस्य आदेश किसी भी समय बदल सकता है।

+0

हाँ, मैंने सोचा कि अंत में और आंशिक कक्षाओं का उपयोग बंद कर दिया। यह अभी उसके बाद काम किया। हालांकि, जैसा कि मेरा डीएलएल वास्तव में csc.exe कमांड लाइन कंपाइलर का उपयोग करके संकलित है और वीएसएनईटी नहीं है, मैंने पाया कि कमांड लाइन में फ़ाइलों के क्रम को बदलने से आंशिक वर्ग के लिए इंटरफ़ेस बनाया गया था। लेकिन आंशिक कक्षाओं का उपयोग नहीं करना सरल समाधान था। – RoboJ1M