2008-08-20 25 views
14

Şu anda eski bir C++ uygulamasıyla etkileşime girmesi gereken yeni bir C# projesi oluşturmak için çalışıyorum. C# uygulamasında kullanmam gereken C++ uygulamasında bulunan bir hata sayımı var.C++ sayımlarını C içine alma C#

Sadece numara # C# içinde numaralandırma bildirmek istemiyorum, çünkü dosyalar birlikte güncelleştirilmemişse, eşitleme sorunları satırda aşağı neden olabilir.

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

ve şöyle bir C# programında kullanmak:

eDeviceIntErrCodes.eDEVICEINT_ERR_FATAL 
alınan bir numaralandırma için beni bir yolu var şöyle açıkladı mı:

Tüm bu varlık Sorum şudur söyledi

cevap

12

PInvoke Interop Assistant http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120 aracını inceleyin. Yerel yöntemler için PInvoke imzaları oluşturmak için yararlı bir araçtır.

Numarayı beslerseniz, bu kodu üretir. Aracın bir komut satırı sürümü vardır, böylece C++ sürümü değiştiğinde enum C# tanımını güncel tutmak için otomatik bir işlem oluşturabilirdiniz.

sizin gibi enum ilan olsaydı

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

Basit cevap hayır olacak. Üzgünüz, yeniden beyan etmek zorunda kalacaksın.

Ancak, geçmişte, C++ enum'ları bir enums.cs dosyasında C# biçimine aktarmak ve bunu yapının bir parçası olarak çalıştırmak için yazılmış komut dosyaları yazdım.

0

:

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

ve başka dosyada:

DEVICE_ERR_CODES eDeviceIntErrCodes;

ve .cs uzantılı enum dosyasını adında, sen mümkün olabilir işe koyul. Sen mi başvurmak istiyorum: Eğer numaralandırma tanımını içeren bir .cs dosyasını #include edebilirsiniz C/C++ olarak

DEVICE_ERR_CODES err = DEVICE_ERR_CODES.eDEVICEINT_ERR_FATAL;
12

. önişlemci direktifleri dikkatli kullanmak C# ve C arasındaki sözdizimi farkların ilgilenir

Örnek

: C# projesinde

#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 

, bir koşullu derleme sembolü "CSharp" make set emin böyle önişlemci tanımı var C/C++ yapı ortamında.

Bu işlemin yalnızca her iki parçanın da derleme zamanında senkronize olmasını sağlayacağını unutmayın. Farklı yapılardan ikili eşleştirmeleri karıştırırsanız, garanti başarısız olur.