Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C和C+之间共享源文件+;_C#_C++_Enums_Code Sharing - Fatal编程技术网

C# 在C和C+之间共享源文件+;

C# 在C和C+之间共享源文件+;,c#,c++,enums,code-sharing,C#,C++,Enums,Code Sharing,我有一个很大程度上是用C语言写的项目。我需要为这个项目的API的所有错误号“defines”定义一个类。我试图避免编写/修改我的许多代码生成器中的一个来实现这一点 我想做的是能够将#内容(如错误污损)直接包含到C/C++项目中。我在C#中定义了它们,如下所示,并且我没有对您将在此处看到的内容使用枚举: using System; namespace ProjectAPI { [Serializable] public sealed class ProjectError { publ

我有一个很大程度上是用C语言写的项目。我需要为这个项目的API的所有错误号“defines”定义一个类。我试图避免编写/修改我的许多代码生成器中的一个来实现这一点

我想做的是能够将#内容(如错误污损)直接包含到C/C++项目中。我在C#中定义了它们,如下所示,并且我没有对您将在此处看到的内容使用枚举:

using System;

namespace ProjectAPI {

[Serializable]
public sealed class ProjectError {

    public enum ProjectErrorClass {
        None            = -1,
        Undefined       = 0,
        Login,
        Store,
        Transaction,
        Heartbeat,
        Service,
        HTTPS,
        Uploader,
        Downloader,
        APICall,
        AutoUpdate,
        General
    }

    public enum ProjectErrorLevel {
        Unknown = -1,
        Success = 0,
        Informational,
        Warning,
        Critical,
    };

    /// <summary>
    /// PROJECT_ERROR_BASE - This is the base for all Project defined errors in the API.  Project Errors are defined as follows:
    ///   ProjectAPI error values are 32 bit values defined as follows:
    ///   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
    ///   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
    ///  +---+---------------+-----------------------+------------------+
    ///  |Sev|Error Code Base| Error Class           |Unique Error Code |
    ///  +---+---------------+-----------------------+------------------+
    ///  where
    ///
    ///      Sev - is the severity code of the error (2 bits), and is defined as follows:
    ///          00 - Success (non-fatal)   0x00
    ///          01 - Informational         0x01
    ///          10 - Warning               0x02
    ///          11 - Error                 0x03
    ///
    ///      Error Code Base - is the starting point of all Project Errors, and is set at 0xA4 (8 Bits).
    ///
    ///      Error Class - is the error class, or API "Module" that caused the error (12 bits).
    ///
    ///      Code - the unique error code (10 bits). (0 - 1,023 (0x3FF)).
    /// </summary>

    private static readonly int ERR_SHIFT                       = 0x1E;
    private static readonly int BASE_SHIFT                      = 0x16;
    private static readonly int CLASS_SHIFT                     = 0x06;

    private static readonly int PROJECT_SEV_SUCCESS           = 0x00;
    private static readonly int PROJECT_SEV_INFO              = 0x01;
    private static readonly int PROJECT_SEV_WARN              = 0x02;
    private static readonly int PROJECT_SEV_ERROR             = 0x03;

    private static readonly int PROJECT_ERROR_BASE             = 0xA5;

    /// <summary>
    /// Project Error Class Constants:
    /// </summary>
    private static readonly int PROJECT_ERROR_CLASS_UNDEF     = 0x0010;   /// Undefined.
    private static readonly int PROJECT_ERROR_CLASS_LOGIN     = 0x0020;   /// LoginClass Error.
    private static readonly int PROJECT_ERROR_CLASS_STORE     = 0x0040;   /// Store Error.
    private static readonly int PROJECT_ERROR_CLASS_TRANS     = 0x0080;   /// Transaction Error.
    private static readonly int PROJECT_ERROR_CLASS_HEART     = 0x0100;   /// HeartBeat (Project Health Monitor) Error.
    private static readonly int PROJECT_ERROR_CLASS_SERV      = 0x0200;   /// Service Error.
    private static readonly int PROJECT_ERROR_CLASS_HTTP      = 0x0400;   /// HTTP/HTTPS Error.
    private static readonly int PROJECT_ERROR_CLASS_UPLOAD    = 0x0800;   /// Upload (Transactions) Error
    private static readonly int PROJECT_ERROR_CLASS_DOWNLOAD  = 0x1000;   /// Download (Transactions) Error
    private static readonly int PROJECT_ERROR_CLASS_APICALL   = 0x2000;   /// API Command/call error.
    private static readonly int PROJECT_ERROR_CLASS_UPDATE    = 0x4000;   /// Auto-Updater Errors.
    private static readonly int PROJECT_ERROR_CLASS_GEN       = 0x8000;   /// General Error.

    public static readonly int PROJECT_ERROR_UNKNOWN_ERROR    = ProjectErrCode(PROJECT_SEV_ERROR, PROJECT_ERROR_CLASS_GEN, 0x001);
    // Was...
    //    (((PROJECT_SEV_ERROR << ERR_SHIFT) | PROJECT_ERROR_BASE << BASE_SHIFT) | ((PROJECT_ERROR_CLASS_UNDEF << CLASS_SHIFT) | 0x0001));

    public static readonly int PROJECT_ERROR_UNKNOWN_HEARTBEAT_ERROR = ProjectErrCode(PROJECT_SEV_ERROR, PROJECT_ERROR_CLASS_HEART, 0x001);
...Snip...
使用系统;
命名空间项目API{
[可序列化]
公共密封类ProjectError{
公共枚举ProjectErrorClass{
无=-1,
未定义=0,
登录,
商店,
交易
心跳,
服务
HTTPS,
上传者,
下载器,
总之,
自动更新,
一般的
}
公共枚举项目错误级别{
未知=-1,
成功=0,
信息性,
警告
批评的
};
/// 
///PROJECT_ERROR_BASE-这是API中所有项目定义错误的基础。项目错误定义如下:
///ProjectAPI错误值是定义如下的32位值:
///   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
///   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
///  +---+---------------+-----------------------+------------------+
///| Sev |错误代码库|错误类|唯一错误代码|
///  +---+---------------+-----------------------+------------------+
///在哪里
///
///Sev-是错误的严重性代码(2位),定义如下:
///00-成功(非致命)0x00
///01-信息性0x01
///10-警告0x02
///11-错误0x03
///
///错误代码基数-是所有项目错误的起点,设置为0xA4(8位)。
///
///错误类-是导致错误的错误类或API“模块”(12位)。
///
///代码-唯一错误代码(10位)。(0-1023(0x3FF))。
/// 
私有静态只读int ERR_SHIFT=0x1E;
私有静态只读int BASE_SHIFT=0x16;
私有静态只读int类_SHIFT=0x06;
私有静态只读int PROJECT\u SEV\u SUCCESS=0x00;
私有静态只读int PROJECT_SEV_INFO=0x01;
私有静态只读int PROJECT\u SEV\u WARN=0x02;
私有静态只读int PROJECT_SEV_ERROR=0x03;
私有静态只读int项目\u错误\u基=0xA5;
/// 
///项目错误类常量:
/// 
私有静态只读int项目\u错误\u类\u未定义=0x0010;///未定义。
私有静态只读int项目\u错误\u类\u登录=0x0020;///LoginClass错误。
私有静态只读int项目\u错误\u类\u存储=0x0040;///存储错误。
私有静态只读int项目\u错误\u类\u TRANS=0x0080;///事务错误。
私有静态只读int项目\u错误\u类\u HEART=0x0100;///心跳(项目运行状况监视器)错误。
私有静态只读int项目\u错误\u类\u服务=0x0200;///服务错误。
私有静态只读int项目\u错误\u类\u HTTP=0x0400;///HTTP/HTTPS错误。
私有静态只读int项目\u错误\u类\u上载=0x0800;///上载(事务)错误
私有静态只读int项目\u错误\u类\u下载=0x1000;///下载(事务)错误
私有静态只读int项目\u错误\u类\u APICALL=0x2000;///API命令/调用错误。
私有静态只读int项目\u错误\u类\u更新=0x4000;///自动更新程序错误。
私有静态只读int项目\u错误\u类\u GEN=0x8000;///一般错误。
public static readonly int PROJECT\u ERROR\u UNKNOWN\u ERROR=ProjectErrCode(PROJECT\u SEV\u ERROR,PROJECT\u ERROR\u CLASS\u GEN,0x001);
//是。。。
//((PROJECT_SEV_ERROR1)使用预处理器。一些ifdef和define应该可以做到这一点,但它会非常混乱

2)使用C++/CLI。C++/CLI是C++编译的一个变种,编译成.NET程序集。.NET类型和本机类型是独立的实体,它们之间的转换是可能的。 例如,您可以将头定义为具有本机枚举和常量的完全本机代码;然后可以将此头包含到100%本机项目和C++/CLI项目中,这也将提供枚举到相应.Net类型的转换()

如果你不想在转换层之间有这个,c++/CLI也给你C++ C++的全部功能,这样你就可以用一个宏文件来做一个文件,比如枚举头和常量,并用相当干净和直接的方式将这些值评估成适当的托管或本地形式(这是因为C语言不能处理,因为它有较弱的预处理器)。。生成的程序集将基本上是此标头和相应的宏定义,而不是其他内容

3)在某些外部文件(XML、INI、……)中定义的值,只在C和C++中实现加载逻辑(这可能是最干净的解决方案)。


<> P> >预处理器中的一个困难原因是C++和C++的注释语法相同:你不能用注释来隐藏C++预处理器的不兼容的C语法。一个空白字符串。我看不出任何方法来处理
[Serializable]
。正如您所说,代码生成器是一个