C#预处理器根据环境变量定义符号
C# preprocessor define symbol based on environment variable
我有一些逻辑是这样的:
#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif
我希望能够根据环境变量切换应用于方法的属性
就像如果设置了环境变量MYVAR
,那么实际上定义符号'MYVAR',反之亦然。
TBH 我不知道这是否可能。如果没有任何想法如何克服这个问题?我当然可以在方法本身中添加它——环境。变量检查,但由于正在执行反射,我需要属性。
我可以创建自定义 MyAttrbute(int mode)
但我无法在其构造函数中添加逻辑来提取环境。变量,因为它必须是常量表达式。
可能的解决方案:
就像第一条评论所建议的那样,我可以阅读环境。自定义属性中的变量。仍然会有一些令人讨厌的反思要做。
因为我正在 Linux 使用 dotnet 命令,所以我实际上可以将我的构建命令与前步骤 sed
命令捆绑在一起并添加一个虚拟占位符 {{define_myvar}}
到 .cs
文件的顶部,并根据环境将其替换为空字符串或完整字符串。变量。这里没有反映,但不是很优雅。
我找到了一个不错的解决方案。
这是 which gave me the idea and little bit more searching in this area.
C#代码:
public static void Main(string[] args)
{
#if MYVAR
Log.Information("MYVAR defined!");
#else
Log.Information("MYVAR not defined!");
#endif
}
项目文件:
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<DefineConstants>$(MyVar)</DefineConstants>
</PropertyGroup>
命令:
dotnet build MyProject.csproj -p:MyVar=$MYVAR -c Debug
dotnet run --project=MyProject.csproj -c Debug --no-build
这些命令也有效(docker 就绪):
dotnet publish MyProject.csproj -c Release -p:MyVar=$MYVAR
dotnet PwC.eSignature.SignMeApi.dll
解释:
如果环境。变量 $MYVAR
设置为 MYVAR
就像在 C# 代码中一样,dotnet build
将用 <DefineConstants>MYVAR</DefineConstants>
替换 csproj 文件并且预处理器将评估 #if MYVAR
为真.
如果环境变量 $MYVAR
未设置(也称为空字符串)或设置为任何其他 与 MYVAR
不同的值,预处理器将评估条件为假。
IMO 这是一个非常好的调整,适用于不同的场景。谢谢各位指点。干杯。
注:
正如问题中所述,我不关心环境变量的值,只关心它是否被定义,即它是否为空字符串。此外,C# 代码只是 PoC,因此使用日志记录比编写属性和折射更容易。
我有一些逻辑是这样的:
#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif
我希望能够根据环境变量切换应用于方法的属性
就像如果设置了环境变量MYVAR
,那么实际上定义符号'MYVAR',反之亦然。
TBH 我不知道这是否可能。如果没有任何想法如何克服这个问题?我当然可以在方法本身中添加它——环境。变量检查,但由于正在执行反射,我需要属性。
我可以创建自定义 MyAttrbute(int mode)
但我无法在其构造函数中添加逻辑来提取环境。变量,因为它必须是常量表达式。
可能的解决方案:
就像第一条评论所建议的那样,我可以阅读环境。自定义属性中的变量。仍然会有一些令人讨厌的反思要做。
因为我正在 Linux 使用 dotnet 命令,所以我实际上可以将我的构建命令与前步骤
sed
命令捆绑在一起并添加一个虚拟占位符{{define_myvar}}
到.cs
文件的顶部,并根据环境将其替换为空字符串或完整字符串。变量。这里没有反映,但不是很优雅。
我找到了一个不错的解决方案。
这是
C#代码:
public static void Main(string[] args)
{
#if MYVAR
Log.Information("MYVAR defined!");
#else
Log.Information("MYVAR not defined!");
#endif
}
项目文件:
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<DefineConstants>$(MyVar)</DefineConstants>
</PropertyGroup>
命令:
dotnet build MyProject.csproj -p:MyVar=$MYVAR -c Debug
dotnet run --project=MyProject.csproj -c Debug --no-build
这些命令也有效(docker 就绪):
dotnet publish MyProject.csproj -c Release -p:MyVar=$MYVAR
dotnet PwC.eSignature.SignMeApi.dll
解释:
如果环境。变量 $MYVAR
设置为 MYVAR
就像在 C# 代码中一样,dotnet build
将用 <DefineConstants>MYVAR</DefineConstants>
替换 csproj 文件并且预处理器将评估 #if MYVAR
为真.
如果环境变量 $MYVAR
未设置(也称为空字符串)或设置为任何其他 与 MYVAR
不同的值,预处理器将评估条件为假。
IMO 这是一个非常好的调整,适用于不同的场景。谢谢各位指点。干杯。
注:
正如问题中所述,我不关心环境变量的值,只关心它是否被定义,即它是否为空字符串。此外,C# 代码只是 PoC,因此使用日志记录比编写属性和折射更容易。