在C#代码中重用.h文件中的define语句

时间:2020-03-06 14:25:22  来源:igfitidea点击:

我有C ++项目(VS2005),其中在#define指令中包含具有版本号的头文件。现在,我需要在双胞胎Cproject中包括完全相同的数字。最好的方法是什么?

我正在考虑将此文件作为资源包含,然后在运行时使用正则表达式进行解析以恢复版本号,但是也许有更好的方法,我们认为呢?

我无法将版本移到.h文件之外,也无法建立版本依赖于它,而Cproject是应适应的版本。

解决方案

MSDN告诉我们:

The #define directive cannot be used
  to declare constant values as is
  typically done in C and C++. Constants
  in C# are best defined as static
  members of a class or struct. If you
  have several such constants, consider
  creating a separate "Constants" class
  to hold them.

我们可以使用托管C ++创建库,该库在常量周围包括类包装器。然后,我们可以从Cproject引用此类。只是不要忘记在常量声明中使用readonly <type>而不是const <type> :)

我们可以始终使用pre-build事件在.cs文件上运行C预处理程序,而可以使用post build事件撤消预构建步骤。预处理器只是一个文本替换系统,因此这是可能的:

// version header file
#define Version "1.01"

// C# code
#include "version.h"
// somewhere in a class
string version = Version;

预处理器将生成:

// C# code
// somewhere in a class
string version = "1.01";

我们只需几个步骤即可实现所需的目标:

  • 创建MSBuild任务-http://msdn.microsoft.com/zh-cn/library/t9883dzc.aspx
  • 更新项目文件以包括对在构建之前创建的任务的调用

该任务会接收一个参数,该参数包含我们引用的标头.h文件的位置。然后,它将提取版本并将该版本放入我们先前创建的Cplaceholder文件中。或者,我们可以考虑使用AssemblyInfo.cs,它通常可以保存版本(如果可以的话)。

如果我们需要其他信息,请随时发表评论。

我们可以编写包含此.h文件的简单C ++ / C实用程序,并动态创建可在C#中使用的文件。
该实用程序可以在预构建阶段作为Cproject的一部分运行。
这样,我们将始终与原始文件同步。

我写了一个Python脚本,将#define FOO" bar"转换为Cand中可用的东西,我在Cproject的预构建步骤中正在使用它。有用。

# translate the #defines in messages.h file into consts in MessagesDotH.cs

import re
import os
import stat

def convert_h_to_cs(fin, fout):
    for line in fin:
        m = re.match(r"^#define (.*) \"(.*)\"", line)
        if m != None:
            if m.group() != None:
                fout.write( "public const string " \
                + m.group(1) \
                + " = \"" \
                + m.group(2) \
                + "\";\n" )
        if re.match(r"^//", line) != None:
            fout.write(line)

fin = open ('..\common_cpp\messages.h')
fout = open ('..\user_setup\MessagesDotH.cs.tmp','w')

fout.write( 'using System;\n' )
fout.write( 'namespace xrisk { class MessagesDotH {\n' )

convert_h_to_cs(fin, fout)

fout.write( '}}' )

fout.close()

s1 = open('..\user_setup\MessagesDotH.cs.tmp').read()

s2 = open('..\user_setup\MessagesDotH.cs').read()

if s1 != s2:
    os.chmod('..\user_setup\MessagesDotH.cs', stat.S_IWRITE)
    print 'deleting old MessagesDotH.cs'
    os.remove('..\user_setup\MessagesDotH.cs')
    print 'remaming tmp to MessagesDotH.cs'
    os.rename('..\user_setup\MessagesDotH.cs.tmp','..\user_setup\MessagesDotH.cs')
else:
    print 'no differences.  using same MessagesDotH.cs'