C#预处理器根据环境变量定义符号

C# preprocessor define symbol based on environment variable

我有一些逻辑是这样的:

#define MYVAR
...
#if MYVAR
[Attribute1]
#else
[Attribute2]
#endif

我希望能够根据环境变量切换应用于方法的属性 就像如果设置了环境变量MYVAR,那么实际上定义符号'MYVAR',反之亦然。

TBH 我不知道这是否可能。如果没有任何想法如何克服这个问题?我当然可以在方法本身中添加它——环境。变量检查,但由于正在执行反射,我需要属性。 我可以创建自定义 MyAttrbute(int mode) 但我无法在其构造函数中添加逻辑来提取环境。变量,因为它必须是常量表达式。

可能的解决方案:

我找到了一个不错的解决方案。 这是 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,因此使用日志记录比编写属性和折射更容易。