近期,X# 项目在 Visual Studio 集成现代化、Visual FoxPro 兼容性、运行时稳定性和项目系统方面进行了密集迭代。以下按功能领域汇总关键变更。
1. Visual Studio 集成与开发体验
属性页重构
- 全部 SDK 风格项目的属性页(常规、生成、调试、语言、方言、全局 Using、生成事件、包)已从 WinForms 迁移至 WPF + MVVM 架构。
- 完美适配 Visual Studio 深色/浅色主题,每个设置均提供“重置为默认值”按钮,并内置配置选择器。
- 修复了属性保存、回读及“幻影”值问题,变更可立即传播。
新工具窗口与导航
- 文档大纲窗口:基于 WPF 实现,以树形结构展示文件成员,可从
视图 > 其他窗口 打开,自动跟随光标。 - “转到定义”结果窗口:当符号有多处定义时,以浮动窗口列出所有结果,方便导航。
- 导航栏与光标跟踪修复,本地函数也能正确更新。
UI 与图标现代化
- 图标全部替换为 ImageMonikers / CrispImage,在完成列表、下拉栏中呈现高清晰、与 VS 一致的视觉效果。
- 注释命令增强:切换注释时将第一行状态应用到所有行;禁止对
TEXT..ENDTEXT 块内部进行格式化以保留布局。 - 启用 SDK 项目的 “发布”和“打包” 菜单项,支持从 IDE 直接创建部署包或 NuGet 包。
项目系统改进
- 完善 SDK 风格项目的 “从项目中排除/包含” 功能,精细控制构建文件。
- 抑制不必要的 MSBuild 调用,显著加快大型解决方案加载速度。
- 防止项目项重复添加,修复项目依赖项对
PackageReferences 的错误响应。 - 实现经典项目到 SDK 项目的 自动转换工具 (
XSConvert2SDK),并创建专用 SdkProjectNode 类。 - 修复 SDK 项目引用在“添加引用”对话框中不出现的问题。
稳定性与线程
- 日志记录和事件处理重构至独立的 Support DLL,确保辅助代码尽早加载,解决加载顺序问题。
- 修复构建过程中添加引用导致的 Visual Studio 死锁。
- 解决项目文件编辑命令的线程问题,保证 UI 更新安全。
2. Visual FoxPro 兼容性全面提升
架构重构
- 实现 无头运行时与 UI 提供程序模式,将 VFP 运行时与 WinForms 解耦,支持非交互式/跨平台场景。
- 新增
VfpUIService 和 VfpUIProvider,通过 AssemblyHelper 动态加载 GUI 提供程序。
新函数与命令
- 新增函数:
NORMALIZE()、DISPLAYPATH()、AUSED()、COMPOBJ()、LINENO()、LoadPicture()、ISMEMOFETCHED()、ISEXCLUSIVE()、ISREADONLY()、TXNLEVEL()、PROW()、PCOL() 等。 - UI 对话框:完整实现
GETDIR()、GETFILE()、GETPICT(),并修复 MESSAGEBOX() 的超时与动态参数问题。 - 命令支持:实现
SET POINT、SET SEPARATOR、SET MEMOWIDTH、SYSMETRIC、COPY TO ARRAY、SET DEVICE TO FILE,并修正 SET DEFAULT TO 的路径处理。 -
DIR/DIRECTORY 命令:重新实现,输出与原生 VFP 一致,管理只读访问。
数组与参数处理
- 为
ADIR()、APRINTERS()、AMEMBERS()、AUSED() 等实现 自动数组创建,无需预声明。 - 引入
FoxArrayInputParameter 特性并在编译器中正确解析,支持 __ScatterArray() 等函数接收未声明数组。 - 重构
ACopy 内部实现,提高可靠性。
关键修复
-
VARTYPE() 对未声明变量正确返回 'U' 而非抛出异常。 -
FSize() 支持 filename 参数,并修复 Set.Compatible 类型存储错误。 -
FTime() 分钟部分错误修正;ROW()、COL()、RGB() 修复。 -
BINTOC() / CTOBIN()、FCHSIZE 完全兼容 VFP。 -
RELEASE ALL LIKE 正确处理带引号通配符。 -
DbCopyToArray 部分字段复制时的越界错误已修复。
VFPXPorter 重大重构
- 菜单生成引擎彻底重写:导出代码改为
INHERIT XSharp.VFP.UI.Menu,完整支持嵌套子菜单和 AddPad/Popup/AddBar 结构。 - 全面审查控件属性:Grid(单元格事件、滚动、高亮色、数据源绑定)、TextBox/ComboBox(对齐、文本选择、KeyPress)、Form/Container(AutoCenter、WindowState、边框、Resize/Activate 事件)等均获完整映射。
- 数据环境增强:改进 FormSet 中关系(ParentAlias、RelationalExpr)的处理与传播。
3. 编译器、宏编译器与语言支持
- 全局 USING 支持:完整处理
GLOBAL USING 语句,符合现代 .NET 模式。 - XML 文档生成修复:解决因 Roslyn 变更导致的异常,并强制在文档生成时使用调试编译器。
- 宏编译器:
- 添加
[NeedsAccessToLocals] 属性,保证宏展开时正确访问局部变量。 - 修复 PRIVATE 变量在传递给带有引用参数的函数后未更新的回归问题。
- 后期绑定:优先调用
NEW 方法,修复构造函数被绕过的问题。 - 引入 XSHARP3 预处理器定义;PUBLIC 构建配置中禁用 VO 和 Vulcan 方言。
- 修复带点名称的
Emit module error 丢失错误信息、调整 RangeExpression 规则等问题。
4. 运行时、RDD 与数据引擎
SQLRDD 增强
- 实现基于 SQL Server 时间戳的 记录锁定(RLock、FLock、UnLock),提升并发安全性。
- 为索引标签添加
Descending 属性,正确生成降序 SQL 并影响查找操作。 - 引入 分页和缓冲(PageSize / BufferSize),优化大数据集 Seek/Goto 性能。
- 优化数据检索:当记录 ID 为当前值时避免不必要的数据库往返。
- 修复 ORDER BY 重复 ID 列名、整数列 GetInt 方法,支持将索引条件加入 WHERE 子句。
DBFVFP 驱动修复
- 修复 AutoIncrement 列的锁定问题。
- 允许索引表达式中使用
Trim(),自动以空格填充键值。 - 修正
Recall 命令行为。 - 复制索引结构时自动排除因字段缺失而失败的标记。
核心工作区重构
- 将
_OpenInfo 字段移入 Workarea 基类并公开访问接口。 - 新增
_IsFileBased 字段区分文件型 RDD,强制表模式必须存在 recno 列。 - Memo 字段最大宽度转为动态属性,修复宽度计算僵化问题。
其他运行时改进
- 文件句柄参数从 INT 统一改为 INT64,确保 AnyCpu 文件操作正常。
- XPP 区域设置支持(NLS 定义、
SetLocale())。 - 添加可空类型隐式运算符;引入
NoIVarGetSelf() / NoIVarPutSelf() 防止隐藏字段意外赋值。 - 修复
USUAL NIL 转换异常、Core 方言返回 NIL 等问题。
5. 项目系统、构建与 NuGet
- 解决方案格式升级:主解决方案转换为
.slnx 格式,并创建 Master.slnx 统一编排构建。 - 项目模板:模板名称统一添加“(SDK)”后缀与
.SDK 标识;VOGUI 依赖项目支持 .NET 4.6/4.7/4.8;重新添加 Linux 和 macOS 支持。 - NuGet 包管理:
- 离线包添加时自动采用正确通配符模式,兼容 nuget.org。
- 非 nuget.org 源直接添加离线包而不覆盖现有配置。
- 包内随附 XML 文档(中文文档已加入),规范文件从
.txt 转为 .xml。 - 使用新的 XSharp 数字证书对包进行签名。
- 构建任务:检测
.rc 文件 BOM 并生成警告;修复 .xaml.prg 依赖规则;移动 VFPProperties.xh 避免全局复制。 - 版本号:升级至 3.0.0.4。
6. 文档、测试与质量保证
文档
- 将单一
VersionHistory.xml 拆分为 XSharp 1 和 XSharp 2 独立文件。 - 大规模更新 西班牙语和中文 文档,提取运行时嵌入式 XML 注释至外部文件以便维护。
- 新增 FoxPro 报表结构 PDF 文档,补充 VFP 和 Visual Objects 移植指南。
- 运行时错误消息改用
__FUNCTION__ 宏,提高准确性。
测试
- 新增 C957 ~ C967 编译器回归测试,覆盖数组、后期绑定、宏展开等边界情况。
- 添加
MathTests、MiscTests、StringExtendedTests、AUsedTests 等专项测试套件。 - 借助 AI 辅助生成部分测试用例,提前暴露并修复了若干晦涩缺陷。
- 移除测试项目中的 XUnit 程序集引用,统一测试配置。
7. 其他值得关注的更新
- GitHub Actions 工作流已更新至最新 action 版本。
- 添加
src/TODO.md 聚合待办事项,贡献者列表更新。 - 清理旧项目、移除对已弃用 Vulcan Runtime 的引用,修正多个拼写错误。
-
AutoCloseMessageBox 标记为过时,引导使用新 API。 - 编译器调试器表达式评估增加
CompileDisplayAttribute 回退支持。
本文参与
腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-05-21,如有侵权请联系
cloudcommunity@tencent.com 删除