सी #


14

में सी ++ गणनाओं को आयात करना मैं वर्तमान में एक नया सी # प्रोजेक्ट बनाने पर काम कर रहा हूं जिसे पुराने सी ++ एप्लिकेशन के साथ बातचीत करने की आवश्यकता है। एक त्रुटि गणना है जो C++ ऐप में पहले से मौजूद है जिसे मुझे C# ऐप में उपयोग करने की आवश्यकता है।

मैं सी # में गणना को फिर से घोषित नहीं करना चाहता क्योंकि यह फाइलों को के साथ अपडेट नहीं किया गया है, तो सिंक समस्याएं नीचे आ सकती हैं।

सब किया जा रहा है कहा मेरे सवाल यह है:

typedef enum 
{ 
    eDEVICEINT_ERR_FATAL = 0x10001 
    ... 
} eDeviceIntErrCodes; 

और इतने की तरह एक सी # कार्यक्रम में इसका इस्तेमाल करते हैं:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
वहाँ एक गणन लिया करने के लिए मेरे लिए एक तरह से तो जैसे घोषित किया जाता है
12

PInvoke इंटरऑप सहायक उपकरण http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120 देखें। मूल तरीकों के लिए PInvoke हस्ताक्षर उत्पन्न करने के लिए यह एक उपयोगी उपकरण है।

यदि मैं इसे अपनी enum खिलाता हूं तो यह इस कोड को उत्पन्न करता है। टूल का एक कमांड लाइन संस्करण शामिल है ताकि जब भी सी ++ संस्करण बदलता है, तो एनम की सी # परिभाषा को अद्यतित रखने के लिए आप एक स्वचालित प्रक्रिया का निर्माण कर सकते हैं।


    public enum eDeviceIntErrCodes 
    { 
     /// eDEVICEINT_ERR_FATAL -> 0x10001 
     eDEVICEINT_ERR_FATAL = 65537, 
    } 

2

सरल उत्तर नहीं होने वाला है। क्षमा करें, आपको फिर से घोषित करना होगा।

मैंने पहले, मेरे सी ++ एनम्स को एक enums.cs फ़ाइल में सी # प्रारूप में आयात करने के लिए स्क्रिप्ट लिखी हैं और इसे बिल्ड के हिस्से के रूप में चलाया है, इस तरह सबकुछ सिंक हो जाता है।


0

आप की तरह enum की घोषणा की थी, तो:

namespace blah 
{ 
    enum DEVICE_ERR_CODES 
    { 
     eDEVICEINT_ERR_FATAL = 0x10001, 
     eDEVICEINT_ERR_OTHER = 0x10002, 
    }; 
}

और एक अन्य फ़ाइल में:

DEVICE_ERR_CODES eDeviceIntErrCodes;

और एक .cs विस्तार के साथ enum फ़ाइल का नाम है, तो आप करने के लिए सक्षम हो सकता है इसे काम करने के लिए मिलता है। आप इसे पसंद संदर्भ चाहते हैं:

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;

12

C/C++ आप जो गणन परिभाषा में शामिल है एक .cs फ़ाइल #include सकते हैं। पूर्वप्रक्रमक निर्देशों का सावधानी से उपयोग सी # और सी के बीच वाक्य रचना मतभेद का ख्याल रखता है

उदाहरण:

#if CSharp 
namespace MyNamespace.SharedEnumerations 
{ 
public 
#endif 


enum MyFirstEnumeration 
{ 
    Autodetect = -1, 
    Windows2000, 
    WindowsXP, 
    WindowsVista, 
    OSX, 
    Linux, 

    // Count must be last entry - is used to determine number of items in the enum 
    Count 
}; 
#if CSharp 
public 
#endif 

enum MessageLevel 
{ 
    None,   // Message is ignored 
    InfoMessage, // Message is written to info port. 
    InfoWarning, // Message is written to info port and warning is issued 
    Popup   // User is alerted to the message 
}; 

#if CSharp 
    public delegate void MessageEventHandler(MessageLevel level, string message); 
} 
#endif 

अपने सी # परियोजना में, एक सशर्त संकलन प्रतीक "CSharp", सेट करें और ऐसी कोई पूर्वप्रक्रमक परिभाषा मौजूद है सी/सी ++ निर्माण पर्यावरण में।

ध्यान दें कि यह केवल यह सुनिश्चित करेगा कि दोनों भागों को निर्माण समय पर सिंक्रनाइज़ किया गया हो। यदि आप विभिन्न बिल्डों से बाइनरी मिश्रण और मिलान करते हैं, तो गारंटी विफल हो जाती है।