Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.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访问.h文件信息#_C#_C_Parsing_Header Files - Fatal编程技术网

C# 如何从C访问.h文件信息#

C# 如何从C访问.h文件信息#,c#,c,parsing,header-files,C#,C,Parsing,Header Files,当使用NI工具创建FPGA位文件时,LabView生成一个C.h文件,其中包含用于与FPGA应用程序通信的信息,如签名(常量)和寄存器地址(作为枚举) 挑战在于我的应用程序是用C#编写的,我需要访问这些寄存器地址 我能想到的唯一选择是: 将.h文件的内容剪切并粘贴到.cs文件中。。。让我不寒而栗的是,C#是一个开发者,FPGA是另一个开发者 解析.h文件~~~~~。。。也让我不寒而栗-编写自己的语言解析器:( 一定有更好的办法 样本h: /* * Generated with the FPG

当使用NI工具创建FPGA位文件时,LabView生成一个C.h文件,其中包含用于与FPGA应用程序通信的信息,如签名(常量)和寄存器地址(作为枚举)

挑战在于我的应用程序是用C#编写的,我需要访问这些寄存器地址

我能想到的唯一选择是:

  • 将.h文件的内容剪切并粘贴到.cs文件中。。。让我不寒而栗的是,C#是一个开发者,FPGA是另一个开发者
  • 解析.h文件~~~~~。。。也让我不寒而栗-编写自己的语言解析器:(
  • 一定有更好的办法

    样本h:

     /*
     * Generated with the FPGA Interface C API Generator 12.0.0
     * for NI-RIO 12.0.0 or later.
     */
    
    #ifndef __NiFpga_M_OTRM_OVDFPGA_h__
    #define __NiFpga_M_OTRM_OVDFPGA_h__
    
    #ifndef NiFpga_Version
       #define NiFpga_Version 1200
    #endif
    
    #include "NiFpga.h"
    
    /**
     * The filename of the FPGA bitfile.
     *
     * This is a #define to allow for string literal concatenation. For example:
     *
     *    static const char* const Bitfile = "C:\\" NiFpga_M_OTRM_OVDFPGA_Bitfile;
     */
    #define NiFpga_M_OTRM_OVDFPGA_Bitfile "NiFpga_M_OTRM_OVDFPGA.lvbitx"
    
    /**
     * The signature of the FPGA bitfile.
     */
    static const char* const NiFpga_M_OTRM_OVDFPGA_Signature = "D0751ADE3A0EC976606D63C425B35E85";
    
    typedef enum
    {
       NiFpga_M_OTRM_OVDFPGA_IndicatorBool_FallingEdge = 0x8132,
       NiFpga_M_OTRM_OVDFPGA_IndicatorBool_StopSignal = 0x813A,
    } NiFpga_M_OTRM_OVDFPGA_IndicatorBool;
    
    ....
    
    #endif
    

    如果它只可能是你需要分析的一小部分的东西,事实上,它不必解析,但可能只需要做一些文本操作/搜索替换。它不应该太难。此外,你可以使用C++。NET将这些东西封装成一个可以从C中使用的API。

    此外,你可能还想看看类似“SWIG”的东西


    我通过向解决方案中添加一个C++/CLI项目解决了这个问题,该项目包括.h文件,并通过托管静态方法公开信息

    public ref class OTRM_Ovd_FPGA
    {
    public:
        static System::String^ GetFilename() { return gcnew System::String(NiFpga_M_OTRM_OVDFPGA_Bitfile);};
        static System::String^ GetSignature() { return gcnew System::String(NiFpga_M_OTRM_OVDFPGA_Signature);};
    
        enum class RegisterAddress : System::UInt16
        {
            InitialPulseAmplitude = NiFpga_M_OTRM_OVDFPGA_IndicatorU16_ExtPulseAmplitudeDisplay,
            CurrentPulseAmplitude = NiFpga_M_OTRM_OVDFPGA_IndicatorU16_ExtPulseAmplitudeDisplay,
            PulseAmplitudeDecrement = NiFpga_M_OTRM_OVDFPGA_ControlU16_Decrement_Step,
            PollPeriod = NiFpga_M_OTRM_OVDFPGA_ControlI16_Frequency_ms,
            HvprotState = NiFpga_M_OTRM_OVDFPGA_ControlI16_HVProt,
            PaceThreshold = NiFpga_M_OTRM_OVDFPGA_ControlI16_VVIThreshold,
        };
    };
    

    你能发布一个.h文件的示例吗?如果它足够简单,请使用regex。否则gcc xmlHow是发布示例.h文件的最佳方式?只需在答案中添加一个小的指示性示例,并使用“作为代码的格式”按钮。“C++.NET”你的意思是C++/CLII不想更新FPGA以要求代码更改(最坏的情况下是构建更新)吗它不会改变,除非它改变了我的想法,我认为C++,NET/C++,CLI;但是我相信它已经被微软正式中断了。我不能保证文件不会改变。登记地址是自动选择的。h是自动生成的。最终这将是很好的。最终我可以移动FPGA文件。(包括生成的.h文件)从应用程序构建到FPGA构建,并使应用程序构建依赖于FPGA构建。然后,FPGA开发人员可以在自己的空间中工作,而不必担心什么构建使用了他的工作…也就是说,直到他破坏了构建-构建服务器将捕获该构建,并自动发送给他,应用程序开发人员操作(和我)一封电子邮件。NICE(IMHO)谢谢Keith,使用语法使其工作比我预期的要困难得多,所以我想展示实际的解决方案。该解决方案的一个丑陋部分是它只支持x86。要使它支持x64,必须使用/clr:safe编译它。不幸的是,/clr:safe不允许使用指针(我必须在.h中使用char*来定义字符串)。非常接近,但目前为止。