在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'