Tôi sẽ xem xét sử dụng tệp .tt để xử lý .h và biến tệp thành tệp .cs. Các tệp nguồn của nó rất dễ dàng và sau đó sẽ là một phần của giải pháp C# của bạn (có nghĩa là chúng sẽ được làm mới dưới dạng tệp .h thay đổi), có thể được nhấp vào để mở trong trình chỉnh sửa, v.v.
Nếu bạn chỉ có có 1 # define nó có thể là một chút overkill, nhưng nếu bạn có một tập tin đầy đủ của họ (ví dụ như một tập tin mfc resource.h có lẽ) thì giải pháp này sẽ trở thành một chiến thắng lớn.
ví dụ: tạo tệp, DefineConverter.tt và thêm nó vào dự án của bạn, thay đổi dòng được đánh dấu để tham chiếu đến tệp .h của bạn và bạn sẽ nhận được một lớp mới trong dự án của bạn đầy đủ các mục nhập const tĩnh. (lưu ý tệp đầu vào có liên quan đến tệp dự án của bạn, đặt hostspecific = false nếu bạn muốn đường dẫn tuyệt đối).
<#@ 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]#>";
<#
}
}
} #>
}
}
này chỉ có vẻ câu trả lời rõ ràng và dễ hiểu nhất đối với tôi. –