如何使用编译条件使 C# 代码拿来就能用
Visual Studio 2022 中 有 .NET Framework 和 .NET Core 编译平台
1、为了代码迁移方便通用,使用预处理器指令来判断编译平台
Visual Studio 2022 中 有 .NET Framework 和 .NET Core 编译平台,编译代码有区别,为了代码迁移方便通用,可以使用条件编译。在C#中,您可以使用预处理器指令来判断编译平台。#if、#elif、#else和#endif指令允许您根据定义的符号来包含或排除代码段。
对于判断编译平台,您可以使用预定义的DEBUG和TRACE符号,或者使用NETCOREAPP、NETFRAMEWORK等符号,这取决于您的目标框架。
以下是一个判断是否为.NET Core 或 .NET Framework 的示例:
#if NETCOREAPP
// .NET Core 特有的代码
#elif NETFRAMEWORK
// .NET Framework 特有的代码
#endif
Visual Studio 2017中编译条件要自己输入,如下:
2、中文代码页在 .NET Framework 和 .NET Core 编译不一样
在 .NET Framework 中默认为 GB2312 或 GB18030,视操作系统决定,.NET Core 中没有 GB2312 或 GB18030 代码页,如下代码获得的 byte 流将不一样。
byte[] bytes = Encoding.Default.GetBytes(Cstring);
对于【中国】:编码不一样,十六进制字符不一样
E4 B8 AD E5 9B BD 中国为 UTF8 的十六进制字符
2D 4E FD 56 为Unicode
D6 D0 B9 FA 为GB2312 GB18030
在 .NET Core 中需要引入中文代码页,这样中文代码页在 .NET Framework 和 .NET Core 编译运行,就要使用条件编译,获得相同的结果,直接上代码:
#if NETCOREAPP
// .NET Core 特有的代码
/// <summary>中文字符串转换到16进制字符</summary>
/// <param name="Cstring">中文</param>
/// <param name="encoding">编码</param>
/// <returns>返回16进制字符</returns>
public static string ChsStringToHexStr(string Cstring, string encoding = "GB18030")
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//引入代码页
//"GB2312" or "GB18030"
byte[] bytes = Encoding.GetEncoding(encoding).GetBytes(Cstring);//使用编码页
//
//byte[] bytes = Encoding.Unicode.GetBytes(Cstring);
string HexStr = Convert.ToHexString(bytes);
HexStr = InsertString(HexStr, 2, " ");
return HexStr;
}
#elif NETFRAMEWORK
// .NET Framework 特有的代码,VS2017运行通过
/// <summary>中文字符串转换到16进制字符</summary>
/// <param name="Cstring">中文</param>
/// <param name="encoding">编码</param>
/// <returns>返回16进制字符</returns>
public static string ChsStringToHexStr(string Cstring, string encoding = "GB18030")
{
//"GB2312" or "GB18030"
byte[] bytes = Encoding.GetEncoding(encoding).GetBytes(Cstring);
// Convert.ToHexString(bytes);
string HexStr = "";
if (bytes != null)
{
for (int i = 0; i < bytes.Length; i++)
{
HexStr += bytes[i].ToString("X2");
HexStr += " "; // 两个Hex数值以空格隔开
}
}
return HexStr;
}
#endif
以上就是通过条件编译代码,使中文字符串转换到16进制字符能够在不同的编译环境能够伸手拿来使用,直接上菜。