gpt4 book ai didi

c# - 在 C# 代码中重用 .h 文件中的定义语句

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:24 25 4
gpt4 key购买 nike

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

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

我不能将版本移到 .h 文件之外,构建系统也依赖于它,C# 项目是一个应该调整的项目。

最佳答案

我会考虑使用 .tt 文件来处理 .h 并将其转换为 .cs 文件。这非常简单,源文件将成为您的 C# 解决方案的一部分(这意味着它们将随着 .h 文件的更改而刷新),可以单击以在编辑器中打开,等等。

如果您只有 1 个#define,它可能有点矫枉过正,但如果您有一个充满它们的文件(例如 mfc resource.h 文件),那么这个解决方案就大获全胜。

例如:创建一个文件 DefineConverter.tt 并将其添加到您的项目中,更改标记行以引用您的 .h 文件,您将在项目中获得一个充满静态常量条目的新类。 (请注意,输入文件是相对于您的项目文件的,如果您需要绝对路径,请设置 hostspecific=false)。

<#@ template language="C#v3.5" hostspecific="True" debug="True" #>
<#@ output extension="cs" #>
<#@ assembly name="System.Core.dll" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>

<#
string input_file = this.Host.ResolvePath("resource.h"); <---- change this
StreamReader defines = new StreamReader(input_file);
#>
//------------------------------------------------------------------------------
// This code was generated by template for T4
// Generated at <#=DateTime.Now#>
//------------------------------------------------------------------------------

namespace Constants
{
public class <#=System.IO.Path.GetFileNameWithoutExtension(input_file)#>
{
<#
// constants definitions

while (defines.Peek() >= 0)
{
string def = defines.ReadLine();
string[] parts;
if (def.Length > 3 && def.StartsWith("#define"))
{
parts = def.Split(null as char[], StringSplitOptions.RemoveEmptyEntries);
try {
Int32 numval = Convert.ToInt32(parts[2]);
#>
public static const int <#=parts[1]#> = <#=parts[2]#>;
<#
}
catch (FormatException e) {
#>
public static const string <#=parts[1]#> = "<#=parts[2]#>";
<#
}
}
} #>
}
}

关于c# - 在 C# 代码中重用 .h 文件中的定义语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/100854/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com