【问题标题】:Use TargetName Macro in code在代码中使用 TargetName 宏
【发布时间】:2016-01-08 08:04:08
【问题描述】:

由于某些原因,我需要从我的代码中读取 TargetName-Macro 的值。它必须是编译时间常数。 我查看了Reflection.Assembly,但反射似乎对我没有帮助,因为我的模块既不是正在执行的程序集,也不会从反射中获得编译时间常数。

有什么办法可以半动态地进行,例如作为预构建步骤,稍后在我的代码中使用 ProjectSettings-Macros?

【问题讨论】:

  • 应不惜一切代价避免条件编译,因为它使代码很难维护。如果你必须这样做,那么设置不同的构建配置,而不仅仅是调试和发布,并让它们设置不同的条件编译符号。然后,您可以在代码中测试这些符号(通过#if Symbol 预编译语法)并相应地设置TargetName-Macro
  • @DavidArno 我不是在谈论条件编译,我需要知道我的程序集的名称,这显然是一个编译时间常数。我只想在我的代码中提供这些信息。
  • 啊,抱歉,我误解了你的问题。我倾向于处理这类事情的方式是通过每次构建事件,例如echo namespace X { static class AssemblyName { const string Name = ""$(TargetName)""; } } > AssemblyName.cs,然后在代码中引用该文件。
  • @DavidArno 这将是一种解决方法,而不是我想的那样,但现在可以。谢谢!
  • @DavidArno 如果您将此作为答案发布,我会接受。当使用回显多行并附加“>>”时,我得到一个我认为可以接受的结果。

标签: c# macros pre-build-event


【解决方案1】:

当你的代码运行你的模块时,正在执行的程序集,所以在这种情况下它会帮助你。

这不是你的 entry 程序集,但那是另一回事。

目标名称是程序集名称,它实际上是您正在执行的程序集文件名,没有扩展名。

实际上,您可以使用正在执行的程序集的 CodeBase 属性,并使用 Path 库来获取它的文件名而无需扩展名。

使用这个:

Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    相关资源
    最近更新 更多