.NET CF 是 .NET Framework 的子集,為了體積精簡,移除了一些「不常用」API。但實務開發常需要這些功能,Common/Fcl.cs 即為**自行實作的補完層**。
static class Fcl
{
// 1. Environment.NewLine → 固定 \r\n (CF 不支援 PlatformID.Unix 判斷)
public static string NewLine => "\r\n";
// 2. File.ReadAllText / WriteAllText (CF 無此靜態方法)
public static string ReadAllText(string path)
{
if (!File.Exists(path)) return "";
using (var sr = new StreamReader(path, Pub.Encode))
return sr.ReadToEnd();
}
public static void WriteAllText(string path, string contents)
{
using (var sw = new StreamWriter(path, false, Pub.Encode))
sw.Write(contents);
}
// 3. Point + Size → Point (CF 缺少 Point.op_Addition)
public static Point Add(Point pt, Size sz) => new Point(pt.X + sz.Width, pt.Y + sz.Height);
// 4. Array.Resize (CF 2.0 缺少泛型版本)
public static void Resize(ref T[] array, int newSize)
{
if (array != null && array.Length == newSize) return;
if (array == null) array = new T[0];
var newArr = new T[newSize];
Array.Copy(array, newArr, Math.Min(array.Length, newSize));
array = newArr;
}
}
| API | CF 狀態 | 替代方案 | 備註 |
|---|---|---|---|
Environment.NewLine | 有,但 PlatformID.Unix 缺失 | 硬編碼 "\r\n" | Windows CE 固定 CRLF,跨平台移植時再處理 |
File.ReadAllText | 無 | StreamReader 手寫 | 注意編碼統一用 Pub.Encode (GB2312) |
Point + Size | 無運算子多載 | 靜態 Add 方法 | 尋路演算法大量使用 |
Array.Resize | CF 2.0 無泛型版 | 自行實作泛型版 | CF 3.5 已內建,專案為相容 2.0 保留 |
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
// Windows CE 不支援 TopMost,避免遮蔽輸入法等系統 UI
miTopMost.Enabled = (Environment.OSVersion.Platform != PlatformID.WinCE);
env.LoadConfig();
env.LoadGroup();
LoadLevel(true);
if (env.IsSave) Restore(env.Steps);
}
此處若直接用 PlatformID.Unix 判斷會編譯失敗,改用 WinCE 判斷是正解。
Path.GetFileNameWithoutExtension、String.IsNullOrEmpty 等 CF 早期版本缺失的方法。