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

时间:2014-01-22 21:50:10

标签: c# c parsing header-files

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

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

我能想到的唯一选择是:

  1. 将.h文件的内容剪切并粘贴到.cs文件中~~~~ ...让我感到沮丧,C#是一个开发人员而FPGA是另一个。
  2. 解析.h文件~~~~ ...也让我发抖 - 编写自己的语言解析器:(
  3. 必须有更好的方法!!!

    示例.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
    

2 个答案:

答案 0 :(得分:0)

鉴于它可能只是你需要解析的一小部分东西,事实上,它不需要解析,但可能只是做一些文本操作/搜索替换。这不应该太难。此外,您可以使用C ++ .NET将内容包装到可以从C#中使用的API中。

你也可以想看看'SWIG'

之类的东西

http://www.swig.org/

答案 1 :(得分:0)

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

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,
    };
};