Show/Hide Toolbars

XSharp

Navigation: X# 文档

版本历史

Scroll Prev Top Next More

注:当一个项目有一个匹配的 GitHub 票据时,票据编号就会出现在项目后面的括号中,前缀为 #。

您可以访问 https://github.com/X-Sharp/XSharpPublic/issues/nnn 其中 nnnn 是票据编号。

如果您在 X# 中发现问题,我们建议您在 GitHub 上报告。我们会通知您问题的处理进度。

Changes in 2.22.0.1

编译器

Bug 修复

修正了 RECOVER USING 语句中未知变量错误行的问题 (#1567)

修复了参数中的默认值导致编译器崩溃的问题 (#1647)

修正了在操作系统中使用字体缩放时,VOWED 工具箱窗口中的文本会出现错乱的问题 (#1650)

修正了向项目中添加 COM 引用时的错误 (#1654)

生成系统

某些从 Vulcan 转换而来的项目文件可能会导致从错误列表中查找错误的问题。该问题已得到修复:在 Visual Studio 内构建时,属性 GenerateFullPaths 现在总是设置为 “true”。

LastXSharpResponseFile.Rsp 和 LastXSharpNativeResourceResponseFile 文件现在总是在临时文件夹中创建,而不是在临时文件夹中的 MSBuildTemp 子文件夹中创建。

运行时

Bug 修复

ExecScript() 现在可调用新宏编译器中的脚本代码 (#1646)

新特性

已将 SetCPU() 和 SetMath() 标记为过时

Bin2Ptr() 和 Ptr2Bin() 现在也能在 X64 模式下运行。返回或预期的字符串长度为 8 个字符。

RDD 系统

修正了当使用比最高索引值更高的底部作用域时,DbOrderInfo() 返回错误的键计数的问题 (#1652)

VOSDK

修正了 DataDialog:ToolBar 返回值总是 NULL 的问题,即使分配了工具栏对象也是如此 (#1660)

VOXporter

新特性

现在,从 .mef 导入时也会生成可视化编辑器的二进制文件和支持文件。 (#1661)

Visual Studio 集成

Bug 修复

修正了用户扩展方法的 IntelliSense 问题 (#1421)

修正了格式化文档中的 DEFINEs 问题 (#1642)

修正了当程序集不存在时读取程序集信息的问题 (#1645)

修正了 VFP 类项目模板中 DEFINE CLASS 语法的问题 (#1648)

修复 Window 编辑器工具箱字体大小的问题 (#1650)

修复在项目中添加 COM 引用的问题 (#1654)

XIDE

常规

推出 “每日小贴士 ”功能

项目窗口搜索器提示的显示时间从 2 秒增加到 5 秒

在项目窗口中添加了使用 F3 重复上次搜索的功能

为 Locals 详细信息编辑框添加了垂直滚动条

Editor

修正了识别某些位置关键字(如 CONSTRUCTOR)的问题

修正了 X# 特定数据类型(USUAL、FLOAT、DATE 等)的 intellisense 问题

修正了从 X# 程序集读取名称中包含特殊字符的函数时的 intellisense 问题

设计器

修复了在表单设计器中解锁控件的问题

调试器

插件系统

已添加 ProjectItemBase:SelectNodeInProjectPad() 方法(适用于所有项目项类型)

添加了属性 Editor:LineHeight、Editor:LineCount 和 Editor:FirstVisibleLine

添加了方法 PluginService:GetEditorColor(eColor AS EditorColor) 和 PluginService:SetEditorColor(eColor AS EditorColor, oColor AS Color)

文档

Bug 修复

[查看源代码] 链接指向的是 Github 上的功能分支。现在指向的是主分支。

更新了关于插值字符串的帮助主题。

Changes in 2.21.0.5

2.21.0.5 中可能出现的中断性更改

所有方言

到目前为止,编译器根据方言为命令行选项提供了几种内置默认值。

这意味着当命令行选项不存在而选择了某种方言时,该选项就会自动启用。我们讨论的是以下选项:

 

方言

选项

Core

AllowNamedArgs

Core

AllowDot

FoxPro

AllowDot

FoxPro

AllowOldStyleAssignments

FoxPro

Vo9

FoxPro

Vo15

FoxPro

InitLocals

Other

Vo15

 

这让一些人(也让我们)感到困惑。例如,如果要禁用 /initlocals- 选项,就必须在使用 FoxPro 方言编译时明确添加该命令行选项。

 

此外,如果项目文件中没有与编译器选项相匹配的特定属性,MsBuild 系统也不会将命令行参数传递给编译器。因此,如果项目文件不包含 <AllowDot> 节点,那么在使用 Core 语言编译项目时,命令行选项 /allowdot 将被启用,但在使用 VO 或 Xbase++ 语言编译项目时,命令行选项 /allowdot 将被禁用。这非常令人困惑!

 

为了解决这个问题,我们采取了以下措施

编译器将删除默认值。

对于项目文件中未定义的选项,编译系统将生成带有“-”标志的命令行选项。这只会发生在 X# 特定的命令行选项上。我们从 Roslyn “继承”的编译器选项,如/debug、/optimize 等,仍将像以前一样工作。

在 Visual Studio 中打开项目文件时,我们会检查上面列出的方言和选项。如果项目文件中缺少某个选项,我们就会添加该选项,并将其值设为 “true”。我们还将删除与方言无关的选项。例如:对于 Core 方言,foxpro 和 xpp 的特定设置将被移除。

 

这通常会导致与之前相同的编译结果。你可能看到的唯一区别是,当你用此版本打开项目文件时,文件会自动更新。

FoxPro 方言

到目前为止,DEFINE CLASS 语法不仅可用于创建继承自 FoxPro 兼容自定义类的类,还可用于创建继承自其他 .Net 类的类。事实证明这有点复杂。

此外,还有一个 /fox1 编译器选项,可使 DEFINE CLASS 命令中的 AS ParentClass 子句成为可选项。没有 AS ParentClass 的类将自动从自定义类继承。

 

我们做了以下更改:

AS BaseType 子句将像在 Visual FoxPro 中一样是强制性的

ParentType 必须是自定义或从自定义派生的类。

/fox1 编译器现已过时

 

如果要从 VFP 类层次结构之外的类(标准 .Net 类)继承,则必须使用 CLASS ... END CLASS 语法。END CLASS 语法。

 

编译器

Bug 修复

修正了字段/内存变量重复声明时的内部编译器错误 (#1475)

修正了在启用 /fox2 的 VFP 方言中调用函数时的错误警告 (#1476)

修正了 FLOAT 类型的最小/最大 IEnumerable 扩展方法的问题 (#1482)

修正了 XBase++ 方言中acess/assign方法的 StackOverflowException 异常 (#1483)

修复了读取带有文件结束标记的 clipper/harbour .prg 文件的问题 (#1485)

修正了预处理器中扩展表达式匹配标记的问题 (#1487)

修正了在 XBase++ 方言中通过引用传递数组引用或 ivar 的问题 (#1492)

修正了针对包含在接口中的方法的 Evaluate() 函数中的 AmbiguousMatchException。 (#1494)

修正了 /fox1 开关在某些情况下被忽略的问题 (#1496)

编译系统现在会自动为使用 X# 编译的程序集添加 TargetFramework 属性 (#1507)

修正了命名空间和属性同名时的歧义问题,以及禁用 /allowdot 选项时的若干问题 (#1515)

修正了带有 TEXTMERGE 子句的 TEXT TO/ENDTEXT 中的问题 (#1517)

修正了编译器错误报告中关于需要 /memvar 选项的误导性行号 (#1531)

修正了与定义索引属性有关的一些问题 (#1543)

修正了 /vo9(处理丢失的 RETURN 语句和返回值)编译器选项的若干问题 (#1544)

Fixed parser problem with END DEFINE, END PROCEDURE and END FUNCTION in the VFP dialect (#1564)

修正了在 FoxPro 方言的 CLASS 语句中使用特性(attributes)的问题 (#1566)

修正了宏编译器在编译强类型代码块时出现的问题 (#1591)

修正了在 VFP 方言中使用 DEFINE CLASS 语法定义的特性(Attributes)被忽略的问题 (#1612)

编译器在构建带有 .editorconfig 文件的解决方案时可能会崩溃。

修正了为 FoxPro 风格类定义内的成员属性生成特性(attributes)输出的问题。

修正了关于在 VFP 方言中定义不含 AS 子句的类的错误信息中的错字(#1611)

添加了对无类型参数的泛型的支持,如 typeof(List< >) 和 typeof(Dictionary<,>) (#1623)

更改与 FoxPro 兼容的 DEFINE CLASS(见上文)

更改了处理命令行参数缺失的方式(见上文)

We have added the double colon (::) separator for interpolated strings to separate the expression from the format specifier. C# uses the single colon (:) but that character is also used as member access operator in X#.See the String Literals topic for more information.

生成系统

我们修正了编译系统中的一个问题,该问题有时会导致重新编译,即使没有更改任何内容。

修正了 machine.config 中的语言与内置系统中的语言定义不匹配的问题

修正了导致 .xml doc 文件写入错误文件夹的问题

更改了将丢失的项目文件属性转换为命令行参数的方式(见上文)

运行时

Bug 修复

修正了一些 DBSetFilter() 与 VO 不兼容的问题 (#1489)

修正了 DBSetFilter() 在没有匹配记录时导致后续调用 DBSetFilter() 或 DBClearFilter() 失败的问题 (#1493)

修正了 FoxPro COPY 命令中 WITH CDX 子句的问题(缺少实现) (#1497)

修正了 SCATTER/GATHER MEMO MEMVAR 的问题 (#1510, #1534)

修正了一个问题,即添加项目时,Collection(集合)类不会增加Count属性(FoxPro 方言)(#1528)

修正了带有 FOR 子句的 APPEND FROM 命令的问题 (#1529)

修正了在 FoxPro 方言中使用 Str() 时的宏编译器问题(导致 INDEX ON 命令出现问题)(#1535)

修正了宏编译器在使用某些语言关键字(如 REF、FIELD、DEFAULT)作为标识符时出现的问题 (#1557)

修复了 VFP 方言中 REPLACE、DELETE 和 UPDATE 命令的问题 (#1574, #1575, #1576, #1577)

修正了 USUAL 类型中的一个问题,即浮点数值的 CompareTo 执行不正确 (#1616)

修正了 USUAL 类型中 ! 运算符与 (LOGIC) cast 相比不能产生正确结果的问题。

我们修复了 XSharp.VFP.UI 库中的几个问题

RDD 系统

修正了 DbZap() 与 DBFNTX 之间的一个问题 (#1509)

修正了 DBFNTX 中 DBSetOrder(0) 始终返回 FALSE 的问题 (#1520)

为与 VO 兼容,当工作区处于 EOF 时使用 FieldPut() 时,消除了运行时错误 (#1542)

修复了 AXDBFCDX 驱动程序中 OrderDescend() 的问题 (#1608)

修正了读取使用多字节编码存储的 DBF 文件的可变长度字段的问题。

修正了用简体中文编码的 DBF 文件被解释为粤语的问题。

修复了 DBF RDD 中的一个问题,即在获取记录或文件锁后,未重新加载 currentbuffer。

我们修复了 DBF 文件大于 2 Gb(0x7FFFFFFF 字节)时的一个问题

在 DBFCDX 驱动程序中创建 UNIQUE 索引时会排除 DBF 文件中的第一条记录

VOSDK

修正了 Window:__CommandFromEvent 中的拼写错误,该错误会导致来自 SEUIXP 的命令产生运行时错误。

Visual Studio 集成

Bug 修复

修复了保存/读取 OldStyleAssignment 编译器选项项目设置的问题 (#1495, #1582)

修正了 VS2022 中的一个问题,即由于 VS 中的一个更改,编辑器中的几个功能不再工作 (#1545)

修正了编辑器中 SCAN...END SCAN 的缩进问题 (#1549)

修正了将 Windows 窗体用户控件的 .resx 文件放在解决方案资源管理器中不正确位置的问题 (#1560)

修复了编辑器中代码片段在 VS 2022 17.11 版中不再工作的问题 (#1564)

Fixed problem with the parameter list auto-showing tooltip when using <Enter> to accept a method from the member completion list (#1570)

修复了带有结束关键字(如 NEXT 和 ENDDO)的缩进行的问题(当这些关键字后跟有 “垃圾 ”时)。

当 include 中的一个文件声明了实体(如 USING SomeNameSpace)时,在 VS 表单设计器中打开表单可能会失败(#1595,#1596)

修正了调试器中以“$”字符开头的标识符(如异常对话框中的“$exception”)无法正确评估的问题(#1602)

修正了使用 DEFINE CLASS  ... ENDDEFINE 声明的 VFP 样式的类的缩进问题(#1609)

新特性

现在,在 VS 中构建任何项目类型时,TargetFramework 属性都会自动添加到程序集中 (#1507)

已添加对 GotoBrace 命令的支持,该命令不仅适用于普通括号,还适用于 IF ... ENDIF 等关键字对  (#1522)

现在,编辑器左上方有一个组合框,显示定义文件的项目。

如果文件存在于多个项目中(作为链接文件),那么项目组合框将显示使用该文件的所有项目名称。

从组合框中选择不同的项目时,缓冲区将重新绘制,因为每个项目的条件编译符号可能不同。

在编辑器中使用 intellisense 时,查找引擎将使用所选的项目。因此,如果一个文件在 2 个项目中使用,那么将使用所选项目的引用和源文件来查找引用数据。

添加了对 FoxPro 关闭关键字变化(如ENDFOR 和 ENDWITH)的正确缩进支持

我们已将项目系统中与 X# 语言相关的若干功能移至语言服务,以便为 SDK 项目的新项目系统做好准备。

我们在 “文件” 级别的完成列表中添加了对片段的支持

我们不再为没有任何 X# 项目的解决方案创建 X# intellisense 数据库

我们对 X# intellisense 数据库结构做了一些更改。当您打开一个已有数据库的解决方案时,数据库将被删除,所有源文件将被重新扫描(仅一次)。

X# 源代码编辑器顶部现在多了一个组合框,可列出包含文件的项目。当一个文件包含在多个项目中时,你可以看到所有项目。切换到新项目将改变 “评估上下文”。条件编译(#ifdef)会在编辑器中反映出变化。

我们在编辑器中添加了对 Edit.NextMethod 和 Edit.PreviousMethod 命令的支持。这些命令通常没有快捷键,但您可以使用 Visual Studio 工具栏上的 “自定义 ”选项来分配它们。例如,您可以指定 Ctrl-DownArrow 和 Ctl-UpArrow。

改进了 VOWED 中的 “克隆窗口 ”选择对话框 (#1508)

在 VOWED 中选择多个控件时,现在最后选定的控件将成为 “属性 ”窗口中的 “活动 ”控件

在 VOWED 中粘贴控件时,控件现在会转到控件顺序列表的底部

在 “VOWED 控制顺序 ”对话框中添加了选项,以便在 “使用鼠标 ”时,在当前选定控件之后开始调整控件的控制顺序

将 Mono.Cecil 库更新至 0.11.6

当以前 “隐含”的属性丢失时,项目文件会被调整(见上文)

XIDE

常规

在 intellisense 中用 Mono.Cecil 代替 System.Reflection,以提高性能和稳定性

工具箱编辑器现在还使用 Mono.Cecil 从 dlls 中读取控件

现在,在打开文件后直接关闭文件时(没有激活另一个文件),焦点会在打开新文件前返回到之前激活的文件。

改进了对独立文件的支持,在属性窗口中增加了方言、引用等选项

将各种 XIDE 支持文件的默认名称从 “vi ”改为 “xi”(.xiaef、xiapp 等)

修正了意外调用旧版本 XIDE 资源编译器和工具箱编辑器的问题

在生成(build)事件中添加了"%OUTPUTEXT%(输出程序集扩展名)宏

在应用程序属性中添加了对 -allowdot 编译器选项的支持,所有应用程序默认启用该选项

修正了无法正确保存编译器选项 /initlocals/modernsyntax/allowoldstyleassignments/namedargs 的问题。

XIDE 主窗口状态栏中的剪贴板项现在可在工具提示中显示当前剪贴板内容

剪贴板选择上下文菜单现在也可显示每个虚拟剪贴板的内容

插件系统的一些小修正(您可能需要重新编译您的插件)

为 “项目” 工具窗口中的项目节点添加了 “打开备用文件夹 ”上下文菜单选项

为窗口资源编辑器添加了包含字符串和文本文件的选项

为FoxPro、XBase++和Harbour方言添加了应用程序模板

现在,“新建应用程序 ”对话框中显示的应用程序模板将根据每个图库文件模板的图库索引设置进行排序

新增菜单选项 View|Load/Save/Reset Layout,用于在 IDE 窗口和工具窗口的不同布局之间切换

在 template.cfg 中添加了一些新模板(代码片段)

已添加项目对 /vo15 编译器选项的支持

为 allowdot 编译器选项添加了独立文件默认设置(Preferences/Compiler)

添加了在运行控制台应用程序时设置控制台位置的选项(Preferences/Advanced)

在主菜单(File/Navigate and Edit/Advanced)中加入多个 “hidden”命令

改进了在Watch工具窗口中删除项目的功能

改进了 “About XIDE”对话框

 

编辑器

改进对代码中关键字的识别

修复了代码中 2 个字母长函数的识别问题

修正了 core 方言应用程序中定义的函数的 intellisense 问题

已为 FOREACH VAR 添加 intellisense 支持

修复了编辑器中 VAR locals 崩溃的问题

修正了 LOCAL IMPLIED 的几个问题

修正了在名称空间中解析已修改类的问题

改进编辑器对 FoxPro、Harbour 和 XBase++ 方言的支持

添加了对大量 FoxPro 关键字的编辑器支持

添加了对 FoxPro 函数的编辑器支持

编辑器现在可识别 FoxPro 方言中的行注释标记 &&

添加了对使用 ? 后缀指定的可空类型(例如 INT?)的 intellisense 支持。

已添加对 ?: 操作符的 intellisense 支持

已添加对 IF <identifier> IS <type> VAR <local> 的 intellisense 支持

已添加选项(Preferences/Editor/Edit) ,以自动调整包含下划线的数字字面量

添加了带 REPEAT...UNTIL 和 BEGIN SCOPE...END 选项的上下文菜单 Surround

添加了在编辑器中排序实体的选项(试验性)(Edit->Sort Entities)

 

设计器

现在,VOWED 属性窗口中的项目按名称排序

现在可通过键盘上的 SHIFT+ 箭头键调整 WED 中控件的大小

在设计器中加载 WindowsForms 表单时,所有 TabControl 现在都会初始选择其第一个 TabPage

自动生成的事件处理程序方法名称现在在控件和名称中的事件部分之间包含下划线

已添加选项(首选项/设计器),可在生成的代码中添加END(方法、构造函数等)语句

已添加选项(首选项/设计器)以输入当前操作系统缩放设置(修复了在非默认设置下创建/移动控件时在错误位置显示套索线的问题)

在 Windows.Forms 和 VO Window 编辑器中添加了锁定/解锁控件的工具栏按钮

控件的锁定状态现在可在 Windows.Forms 设计器中保留(需要保存表单才能应用)

修正了将 strip items 的 Text 属性设置为空的问题

在 VOWED 控制顺序对话框中添加了选项,以便在 “使用鼠标 ”时,在当前选定控件之后开始调整控件的控制顺序。

在 Windows.Forms 工具箱中添加了组件 SaveFileDialog、OpenFileDialog 和 FolderBrowserDialog

调试器

调试时的异常对话框现在可正确显示异常信息

修正了在排除已处理的异常时不正确中断的问题

修复了调试器中可能发生的常见崩溃问题

插件系统

插件系统的一些小修正(您可能需要重新编译插件)

已添加 Plugin:OnAfterCompileApplication(oApp AS Application, eResult AS CompileResult) 回调方法

添加了 Editor:SetSelection() 方法,用于在编辑器中选择文本

从插件系统返回的实体对象不再包含END CLASS 和 END NAMESPACE 语句

文档

Bug 修复

文档多处的更正 (#1504, #1506, #1514)

新特性

中文文档的多处更新

添加了丢失的 SCAN...ENDSCAN 文档 (#1548)

为 DBOrderInfo() 函数主题添加了缺失的可用常量 (#1565)

修正了文档中有关 -memvar 选项的错误文本 (#1621)

Changes in 2.20.0.3

编译器

Bug 修复

修复了在 FoxPro 方言中 USE 命令 的 AGAIN 子句问题 (#235)

修复了启用 -namedargs 编译器选项的情况下在编译时调用带有命名参数的类型数组(typed array)构造函数的问题 (#1430)

修复了 INSTANCE 关键字与类内部使用的不一致 (#1432)

修复了 REPLACE UDC 可能会阻止使用名为 “replace” 的变量的问题 (#1443)

修复了 -vo9(处理丢失的 RETURN 语句)编译器选项与分部类中的 ACCESSes 的问题 (#1450)

修复了词法分析器在 FoxPro 方言中识别字符串内的续行符的问题 (#1453)

修复了 memvar pragma 选项的问题 (#1454)

修复了 -xpp1 编译器选项的问题。(#1243, #1458)

修复了当涉及的对象未定义类型时,从定义成员的类中访问方法中 Hidden 类成员的问题(#1335, #1457)

修复了单行代码行仅包含单逗号时的内部编译器错误 (#1462)

修复了使用 USE 命令 时以方括号为包含文件名的字符定界符时产生的问题 (#1468)

新特性

现在,您可以使用 NULL() 和 DEFAULT() 表达式以默认值初始化任何变量。这相当于 C# 中的 DEFAULT 关键字。

我们添加了一个新的编译器选项 -modernsyntax (#1394)。这将禁用某些传统功能:

o&& 作为行注释

o* 在行首表示注释

o使用方括号的字符串

o括号表达式列表(因此更容易识别元组)

已添加对 IS NULL 和 IS NOT NULL 模式的支持 (#1422)

在 Harbour 方言中添加了对文件宽 FIELD 语句(file wide FIELD statements)的支持 (#1436)

运行时

Bug 修复

修复了在 Transform() 函数中使用 PTR 参数时的运行时错误 (#1428)

修复了传递 PSZ 参数时,多个 String 运行时函数抛出运行时错误的问题 (#1429)

修复了在 ADS RDD 中使用 OrdKeyVal() 和 ADS/ADT 文件时的问题 (#1434)

修复了在创建和使用长名称的 order 时,与各种 xBase 方言的不兼容问题 (#1438)

修复了在 ADS RDD 中使用 OrderKeyNo() 时,如果设置 Ax_SetExactKeyPos() 为 TRUE,则会出现 VO 不兼容的问题 (#1444)

修复了宏编译器在传递超过两个引用参数时的问题 (#1445)

修复了 DBSetIndex() 设置记录指针在 eof 时的问题 (#1448)

修复了从 OEM dbfs 读取字段时的问题 (#1449)

新特性

实现了 DBFMEMO 驱动程序(#604)

实现了 DBFBLOB 驱动程序(#605)

添加了缺失的无参数 SetColor() 函数重载(#1440)

此版本包含了新的 XSharp.VFP.UI.DLL ,该 DLL 由从 Visual FoxPro 导出的表单使用,通过 VFP Exporter 实现。

Visual Studio 集成

Bug 修复

修复了 VS 2019 中“跳转到文件”命令的问题 (#1146)

修复了局部函数的“转到定义”功能不工作的问题 (#1415)

修复了在某些情况下类导航框显示错误当前条目的问题 (#1426)

修复了设置 -namedargs(启用命名参数)选项在项目设置中存在的问题 (#1431)

修复了外部程序集中的类型的代码生成器未为索引属性生成参数的问题 (#1442)

修复了 VODBServer 编辑器未保存 [DBSERVER] 部分的 access/assigns 和其他实体的问题 (#1452)

修复了在 VO 窗口编辑器中加载 cavowed.inf 文件提供的带有绝对或相对路径的补充文件的问题 (#1470)

修复了 VS2022 调试器中不同 DLL 包含相同命名空间但大小写不同时的问题。

修复了编辑器内的实体解析器未能正确确定包含本地函数或过程的实体结束的问题

修复了编辑器内的实体解析器在未启用 /memvars 编译选项时,遇到行首的 param 标记时会出错的问题。

新特性

我们已经在帮助菜单中为中文版本的文档添加了一个菜单项。

VOXporter

Bug 修复

修正了将属性转换为字符串字面量不正确的问题 (#1404)

新特性

现在可以在任何模块的 VO 代码中定义特殊的 TEXTBLOCK 实体,名称为 “VXP-TOP” 或 “{VOXP:TOP}”,VOXporter 将自动在模块导出的 X# .prg 文件开头插入文本块的内容。这对指定 #using 语句(#1425)等顶级命令特别有用。

VFPXporter

该版本的 X# 包含 VFP Exporter 。该工具可将 Visual FoxPro 项目文件转换为 Visual Studio 解决方案

XIDE

当尝试在错误的 XIDE 版本中调试 32/64bit 应用程序时,添加了自动打开替代版本的选项。

修正了编辑器中几个位置关键字的着色问题

改进了编辑器对 TEXT...END TEXT 的支持

已添加编辑器对 NOT NULL 代码模式的支持

已添加对编译器选项 /namedargs、/initlocals、/modernsyntax 和 /allowoldstyleassignments 的项目支持

现在,启动时按 SHIFT 键会将 IDE 的布局重置为默认位置(退出时不会保存)。

已添加菜单命令 View->Save Current Layout(查看->保存当前布局)

修正了在列选择中切换所选文本大小写 (CTR+U) 的问题

修正了将带有 PROC 或 FUNC 等标识符的行误认为实体定义的若干问题

文档

Bug 修复

修复了 /namedargs 编译器选项主题中的拼写错误。

新特性

我们添加了几个关于修饰符(modifiers) 的章节

我们添加了(部分)翻译成简体中文的帮助文件。

Changes in 2.19.0.2

编译器

Bug 修复

现在编译器在类型中定义重复字段名时会正确报告错误 (#1385)。

修复了在泛型类型中定义多个类型约束的问题 (#1389)。

修复了全局内存变量隐藏同名局部变量或参数的问题 (#1294)。

修复了在找不到类型时出现虚假编译器错误消息的问题 (#1396)。

修复了在 FoxPro 方言中缺少对 XSharp.VFP 的引用导致编译器崩溃的问题 (#1405)。

修复了 -initlocals 编译选项错误地初始化类字段的问题 (#1408)。

修复了预处理器中扩展匹配符号无法正确匹配以字符串字面量开头的表达式的问题。

新特性

我们增加了对维度(FoxPro)类属性的支持,例如:
 
       DIMENSION this.Field(10)
 

我们添加了对 FOREACH AWAIT 的支持,如以下示例(适用于 .Net Core、.Net 5 及更高版本)。

 
 FOREACH AWAIT VAR data IN GenerateNumbersAsync(number)
           SELF:oListView1:Items:Add(data)
         NEXT

我们已经添加了对合并成员访问的支持,例如在以下示例中,FirstName 和 LastName 都是 oPerson 对象的属性::

 

 ? oPerson:(FirstName+" "+LastName)

 

WITH 命令现在也能识别 AS DataType 子句。

XBase++ 类声明现在也允许使用 “END CLASS” 作为结束标记。

现在,编译器在尝试将 Lambda 表达式转换为常规表达式时会报错 (#1343)

我们增加了对元组(TUPLE)数据类型的支持。这包括声明局部变量、参数、返回值等。

我们还支持将元组返回值分解为多个局部变量。更多信息,请参见元组帮助主题。.

运行时

Bug 修复

修复了从宏编译器调用 DoEvents() 的问题 (#872)

修复了 __Mem2StringRaw()(文档未记录)函数的问题 (#1302)

修复了在头部中包含不正确排序信息的 DBFCDX 索引文件打开问题 (#1360)

修复了 OrdSetFocus() 在无参数调用时重置当前顺序的问题 (#1362)

修复了在 DBPack() 后一些索引文件的问题 (#1367)

修复了在所有记录都被删除的表上 Deleted() 返回 TRUE 的问题 (#1370)

修复了以独占和只写模式打开并使用 FWrite() 等函数写入文件的问题 (#1382)

修复了 SplitPath() 函数中的几个问题(与 VO 不兼容性) (#1384)

现在,当在 dbf 头部中找不到代码页时,将使用 RuntimeState 中的 DOS 代码页,而不再使用硬编码的代码页 437 (#1386)

在运行时的某些区域中使用的 Dictionary<,> 类被替换为 ConcurrentDictionary<,>,以避免多线程应用程序中的问题 (#1391)

在使用 IDynamicProperties(FoxPro 方言)时,修复了 NoIVarget 的问题 (#1401)

修复了 Hex2C() 使用小写字母时与使用大写字母时产生不同结果的问题。
请注意,这个 bug 也存在于 VO 中,所以现在在 X# 中使用小写十六进制字母的 Hex2C() 的行为与 VO 不同 (#1402)

访问已使用 Advantage RDD 打开的已关闭 DbServer 对象上的属性可能会在调试器中引起问题。现在,当服务器关闭时,DbServer 类将返回空值。

新特性

实现了 CREATE CURSOR 命令 [FoxPro] (#247)。还实现了 CREATE TABLE 和 ALTER TABLE(FoxPro 方言)

实现了 INSERT INTO 命令(FoxPro 方言,用于从值、数组、对象和内存变量中插入变量)。SQL 查询中的 INSERT INTO 尚不能使用 (FoxPro 方言)

在 XSharp.VFP 中实现了 Str() 函数的新 FoxPro 兼容版本 (#386)

现在,当打开索引文件失败时会抛出错误 (#1358)

添加了 AscA() 函数,并使 Asc() 依赖于运行时中的 SetAnsi() 设置 (#1376)

头文件

Bug 修复

实现了几个缺失的命令 (#1407)

修复了 SET DECIMALS TO 命令中的拼写错误 (#1406)

为 GATHER 命令(FoxPro)添加了缺失的 NAME 和 MEMVAR 子句 (#1409)

更新了几个命令,使一些标记变为可选,并更加兼容各种方言 (#1410, #1412)

修复了在各种方言中 COMMIT 命令的各种不兼容性问题 (#1411)

Visual Studio 集成

Bug 修复

修复了通过静态使用引用的类型中查找公共静态字段的问题 (#1307)

修复了在块语句内定义的局部变量的 intellisense 问题 (#1345)

修复了 intellisense 不正确地将代码中指定的类型解析为 usings 列表中的另一个类型的问题 (#1363)

修复了在输入冒号后不正确显示静态方法的成员完成问题 (#1379)

修复了特定代码导致编辑器冻结的问题 (#1380)

修复了在某些情况下类导航栏未显示方法名称的问题 (#1381)

新特性

增加了对 IEnumerable 和 DataTable 调试可视化器的支持 (#1373)。
请注意,当浏览 X# 数组时,可视化器中的结果看起来非常丑陋,因为可视化器忽略了隐藏属性和字段的属性,以用于我们的 USUAL 类。

调整了 Globals、Workareas 等调试器窗口,以遵循在 VS 中选择的全局主题 (#1375)。还向 Workarea 窗口添加了状态面板,这样您可以查看工作区状态或字段名称/值。

为使用 USING VAR 或 USING (LOCAL) IMPLIED 声明的局部变量添加了 intellisense 支持 (#1390)。

现在 intellisense 数据库使用了一个具有 ARM 支持的 SQLite 包,因此它也将在 Mac 和其他平台上工作 (#1397)。

VOXporter

修复

修正了 VOXporter 用 {VOXP:UNC} 标记错误修改先前已注释代码的问题 (#1404)

文档

Bug 修复

运行时帮助中函数的文档描述有误。
例如,“Left” 函数的主题标题原为 “Functions.Left Method”,现已更改为 “Left Function”。

文档中的 “SingleLineEdit” 类被称为 “Real4LineEdit”,已进行修正。

新特性

我们在 X# 编程指南中添加了有关多个主题的附加文档。

Changes in 2.18.0.4

编译器

Bug 修复

修正了一些与 XBase++ 相关命令的预处理器问题 (#1213, #1288, #1337)

修正了隐式访问静态类成员的问题(XBase++ 方言) (#1215)

修正了 DIMENSION 命令(VFP 方言)的解析器错误 (#1267)

修正了多行代码中 UDC 的预处理器问题 (#1298)

现在,每个 “unused variable(未使用变量) ”警告都会在变量定义的确切位置报告,而不是总是在第一个位置报告(#1310

修正了 SET RELATION 命令 中错误的 “unreachable code(无法到达代码) ”警告 (#1312)

修正了为编译器生成的 <Module>.$AppInit 和 <Module>.$AppExit 方法生成 XML 文档的问题 (#1316)

修正了访问另一个对象的 Hidden 字段的问题(XBase++ 方言)(#1335)

修正了使用显式类指示调用父方法的问题(Xbase++ 方言) (#1338)

修正了代码 “SLen(c := SomeFunction())” 中错误调用函数两次的问题 (#1339)

修正了父类方法在派生类中不可见的问题(Xbase++ 方言) (#1349)

修正了 ::new() 在类方法中无法正常工作的问题(Xbase++ 方言) (#1350)

修正了当在头文件中定义的标记出现错误时的异常情况

修正了从 XBase++ 方法返回 super:Init() 时的编译器错误 (#1357)

修正了同名 .prg 文件中的静态定义问题 (#1361)

新特性

引入了未为 OUT 参数指定 OUT 关键字的警告 (#1295)

更新了不带参数的方法和构造函数调用的解析器规则。这可能会加快编译速度。

编译器不再 “内联” SLen()。如果您在应用程序中引用 XSharp.Core,SLen() 现在会被解析为 X# Core 中的 SLen() 函数。
如果编译时没有使用 X# 运行时,或者编译时使用的是 Vulcan 运行时,那么现在就需要在代码中添加 SLen() 函数。
这是 X# Core 中的代码,您可以将其用作模板
FUNCTION SLen(cString AS STRING) AS DWORD
  LOCAL len := 0 AS DWORD
  IF cString != NULL
     len := (DWORD) cString:Length
  ENDIF
  RETURN len

添加了对 Harbour 也支持的预处理器命令 #ycommand#ytranslate 的支持。它们的工作方式与 #xcommand 和 #xtranslate 相同,但标记以区分大小写的模式进行比较 (#1314)

某些 Xbase++ 特定功能的代码生成发生了变化。

我们使用 IN <ursor> 子句增加了几个 UDC

我们为 FoxPro CAST 表达式添加了 UDC 支持

更多 SET 命令现在也支持 & 运算符

编译器现在在更多位置支持“Late bound names(后期绑定名称)”,例如在 REPLACE 命令、With 命令等中。现在可以编译而无问题。

cVar := "FirstName"
WITH oCustomer
  .&cVar := "John"
END WITH
and this too
 
cVar := "FirstName"
REPLACE &cVar with "John"

运行时

Bug 修复

修正了在清除关系之前错误关闭 dbf 文件的问题 (#1237)

修复了文件创建后索引范围可见性不正确的问题 (#1238)

修正了 FFirst()/FNext() 无法找到过滤器指定的所有文件的问题 (#1315)

修正了 DBSetIndex()/VoDbOrdListAdd() 总是将控制顺序重置为 1 的问题 (#1341)

修复了当键表达式类型为 DATE 时,在 DBFCDX 驱动程序中更新索引键的问题。

修正了当 Str() 和 StrZero() 的内置最大字符串长度为 30 时的问题(#1352)

RegisteredRDD 类现在使用 ConcurrentDictionary。

当目标表中缺少一个字段时,修正了 RDD TransRec() 方法中的一个错误 (#1372)

修正了 Advantage RDD 中的一个问题,以防止在表关闭时调用 ADS 函数

修复了 Advantage RDD 中的一个问题,即在读取名称不正确的字段时可能出现的问题

当当前目录为 UNCPath 时,修正了 CurDir() 函数中的一个问题(\\Server\Share\SomeDir) (#1378)

新特性

已添加对在 USUAL 类型中访问索引器的支持 (#1296)

我们添加了一个 DbCurrency 类型,当读取货币型字段时,它会从 RDD 返回。

实现了 TEXT TO FILE 命令 (#1304)

现在,当创建索引顺序时 tagname > 最大长度时,RDD 会报告错误(对话框) (#1305)

添加了一个接受 System.Type 参数的函数 _CreateInstance()

后期绑定代码现在可以检测 Send()、IVarGet() 和 IVarPut() 的调用位置,并在调用代码与类成员声明类型相同时允许访问私有/隐藏字段。这在一些与 XBase++ 相关的更改中使用。

XBase++ 中的类已稍作调整。

更改了多个 DBF / Workarea / Cursor 相关 UDC 的映射,使其与 FoxPro 更加兼容。

我们为 FoxPro CAST 表达式添加了运行时支持

我们对字典进行了一些小的代码优化 (#1371)

当服务器关闭时,一些 DbServer 属性不再调用 RDD,而是返回空白值。

类型化 SDK 类

添加了不带参数的 DbServer:Append() 重载 (#1320)

添加了丢失的 DataServer:LockcurrentRecord() 方法(#1321

修复了以 ShellWindow 为所有者创建 DataWindow 时的运行时错误 (#1324)

将 DataWindow:Show() 方法改为 CLIPPER,以便与现有代码兼容 (#1325)

修复了在 VO 窗口上使用 ComboBox 时出现的异常 (#1328)

修正了打开已分配服务器的 DataWindow 时的错误 (#1332)

修正了以非类型化的 FileSpec 对象作为第一个参数实例化 DBServer 对象时的运行时错误 (#1348)

修正了在组合框和列表框中显示项目的问题 (#1347)

当服务器关闭时,一些 DbServer 属性不再调用 RDD,而是返回空白值。

Visual Studio 集成

Bug 修复

修正了项目文件中 “allow dot(允许点)” 设置的问题(#1192)

$CALLSTACK 等几个宏无法以预期格式返回值。这一问题已得到修复 (#1236)

修正了当 form.prg 第一行中存在块注释时的生成问题 (#1334)

修正了在单行中对代码段进行块注释的问题 (#1336)

修正了当项目文件包含 <GenerateAssemblyInfo>True</GenerateAssemblyInfo> 属性时项目生成失败的问题 (#1344)

修正了解析器中的一个问题,该问题会导致表达式计算器中 DebuggerDisplay 属性的解析出错。

新调试器窗口没有遵循当前窗口主题。现在已部分修复 (#1375)

VO 键入编辑器

修正了在 VOWED 中使用特定字体的 CheckBox 和 RadioButton 标题在设计时的显示问题 (#796)

修正了 VOWED 编辑器将 prg 中的所有现有类更改为分部类的问题 (#814)

修正了在 VOWED 中错误添加构造函数代码以实例化 DataBrowser 的问题,即使没有(未删除的)数据列也是如此 (#1365)

修正了 VOMED 中源代码和资源文件中菜单项定义名称的几个问题 (#1374)

VOXporter

新特性

引入选项(在现有代码中内嵌),用于注释、取消注释和删除原始 VO 代码中的行 (#1303)

- {VOXP:COM} // comment out line

- {VOXP:UNC} // uncomment line

- {VOXP:DEL} and // {VOXP:REM} // remove line

安装

新特性

安装程序现在会检测是否安装了所需的 Visual Studio 组件 “Core Editor ”和“.Net Desktop Development”。
如果发现一个或多个 VS 安装,但其中没有一个安装同时具备所需的组件,则会显示警告。

Changes in 2.17.0.3

编译器

Bug 修复

修正了与 XBase++ 在使用类成员方面的不兼容问题 (#1215) UNCONFIRMED

修正了/vo3 选项在 XBase++ 方言中无法正常工作的问题。还添加了对修饰符 final、introduce 和 override 的支持 (#1244)

修正了在类字段上使用 NEW 修饰符的问题 (#1246)

修复了几个与 XPP 方言 UDC 有关的预处理器问题 (#1247#1250)

修正了 VO 与方法和属性中 INSTANCE 字段的特殊处理不兼容的问题 (#1253)

修正了调试器不稳定地跳转到不正确行的问题 (#1254#1264)

修正了嵌套语句在某些情况下显示错误行号的问题 (#1268)

修正了没有 CASE 行的 DO CASE 语句会在编译器中产生内部错误的问题 (#1281)

修复了几个预处理器问题 (#1284#1289)

启用后期绑定后,在使用 SUPER 调用不存在的方法时,修正了编译器缺失错误 (#1285)

修正了 CONST 类字段缺值赋值时出现的发射模块失败错误 (#1293)

修正了预处理器中重复匹配标记(如 SET INDEX TO 命令中的匹配标记)的问题。

修正了一个问题,即当接口在编译时为 “未知” 和/或属性名不是 “Item ”时,带有明确接口前缀的属性定义可能导致编译器崩溃 (#1306)

新特性

已添加对 “经典” INIT PROCEDURE 和 EXIT PROCEDURE 的支持 (#1290)

当 case 块、if 块和其他块内的语句列表为空时,已添加警告。要抑制该警告,可在代码中添加 NOP 语句。

我们对编译器中的词法和解析器进行了一些修改。这可能会减少内存占用量,并加快代码的编译速度。

运行时

Bug 修复

修正了 CToD() 中的几个问题(与 VO 不兼容) (#1275)

已添加对 AAdd() 中第 3 个参数的支持,以指定在何处插入新元素 (#1287)

Default() 函数现在不再更新值为 NULL_OBJECT 的 usuals,以便与 Visual Objects 兼容 (#1119)。

我们为 AdsSQLServer 类添加了参数支持 (#1282)

Visual Studio 集成

新特性

我们为以下项目添加了调试器面板窗口:

oGlobal variables

oDynamic memory variables (Privates and Publics)

oWorkareas

oSettings

您可以在调试过程中通过 Debug/XSharp 菜单打开这些窗口。还有一个特殊的 “X# 调试器工具栏”,也只在调试期间显示。

这些窗口只有在调试的应用程序使用 X# 运行时才会显示信息(因此无法与 Vulcan 运行时结合使用)。
如果您正在调试使用 X# 运行时的其他语言编写的应用程序,那么这些窗口也会显示相关信息。
我们计划在今后的版本中为这些窗口添加更多功能,例如当前选定区域的属性和当前选定工作区中的字段/值。

我们为 X# 文件添加了对 “FileCodeModel ”的支持。WPF 设计器和 XAML 编辑器都会使用此功能。
现在还修复了 XAML 编辑器中的“转到定义”  (#1026)

X# 项目的若干属性现在已缓存。这将使性能略有提高。

我们为用户自定义命令添加了 “转到定义” 支持。例如,在 USE 命令的 USE 关键字上选择 “转到定义”,就会跳转到标准头文件中的定义。

Bug 修复

修正了 Type[,] 数组的成员完成问题 (#980)

修正了当同名类不存在命名空间时命名空间内类的成员补全缺失 (#1204)

修正了当实体在预处理行中有属性时自动缩进的问题 (#1210)

修正了某些情况下静态成员的 intellisense 问题 (#1212)

修正了代码或声明跨多行时的一些 intellisense 问题 (#1221#1260)

修正了命名空间内嵌套类的 intellisense 问题 (#1222)

当使用类型转换时,修正了对 VAR local 类型的错误解析 (#1224)

修正了编辑器中折叠/展开代码的几个问题 (#1233)

修正了显示未知类型的假成员完成列表 (#1255)

修复了使用 Ctrl + 空格键自动键入文本的一些问题(完整 Word) (#1256)

修正了 Text .. EndText 语句的着色问题 (#1257)

修正了泛型的工具提示提示的几个问题 (#1258#1259#1273)

修正了委托签名不显示在 intellisense 工具提示中的问题 (#1265)

修正了带有多行注释的代码的无效着色 (#1269)

修正了键入 “self. ”后成员完成中的无效条目。(#1270)

修正了在选项 X# Custom Editors\Other Editors\Disassembler 中指定的路径带有空格时调用反汇编器的问题 (#1271)

修复了使用某些 UDC 调用时编辑器着色完全停止的问题 (#1272)

修正了 FOR 语句中 CONSTANT local 变量不显示提示的问题 (#1274)

修正了代码包含 LOOP 或 EXIT 关键字时的自动缩进问题 (#1278)

修正了编辑器在特定情况下输入括号时出现的异常 (#1279)

修正了在设计模式下尝试打开文件名以大括号开头的文件时出现错误的问题 (#1292)

VS 内的 “XSharp 网站 ”菜单选项已损坏 (#1297)

修复了匹配相同标识符功能中可能导致 Visual Studio 运行速度减慢的问题

修复了在调试过程中打开文件时可能发生的 VS 锁定问题。

带有静态构造函数和普通构造函数的类的参数提示未得到正确处理。这一问题已得到修复。

在打开项目时,如果缺少从属项(如 .resx 文件或 .designer.prg 文件)与其父项之间的从属关系,则可能出现异常,导致项目无法打开。这一问题已得到修复。

当同一行出现两个编译器错误且错误代码相同时,有时会在 VS 输出窗口中显示,但不在错误列表中显示。这一问题已得到修复 (#1308)

VOXporter

新特性

已添加对特殊标记 {VOXP:COM}、{VOXP:UNC} 和 {VOXP:DEL} 的支持。/ {VOXP:REM},以注释、取消注释和删除原始 VO 代码中的行 (#1303)

Changes in 2.16.0.5

编译器

Xbase++ 方言的新特性

我们对 Xbase++ 类定义的生成方式进行了多项修改。请使用新版本并检查您的代码!

现在我们为所有类生成一个类函数。它返回的对象与 Xbase++ 类的 ClassObject() 方法相同。
无论使用 /xpp1 编译器选项与否,都会生成该类函数。
Class 函数依赖于函数 __GetXppClassObject 和 XSharp.XPP.StaticClassObject 类,这两个函数都可以在 XSharp.XPP 程序集 (#1235) 中找到。
通过类函数,您可以访问类变量和类方法。

在 Xbase++ 中,您可以使用相同名称的字段(VAR)和属性(ACCESS / ASSIGN METHOD),甚至具有相同的可见性。而以前是不支持的。
现在,编译器会自动将字段设为 protected(或 FINAL 类的 private),并使用 [IsInstance] 属性对其进行标记。
在类的代码中,编译器会将名称解析为字段。在类外的代码中,编译器将把名称解析为属性。

对于派生类,编译器现在会自动生成一个带有父类名称的属性,该属性被声明为父类,并返回等同于 SUPER 的属性。

我们更正了 Xbase++ 方法的 FINAL、INTRODUCE 和 OVERRIDE 关键字 (#1244)

我们更正了在 XBase++ 方言中访问静态类成员的一些问题 (#1215)

现在,您可以使用 “::” 前缀访问类变量和类方法内部的类方法。

当一个类被声明为另一个类的子类时,编译器会在子类中生成一个(类型化)属性来访问父类,就像 Xbase++ 所做的那样。该属性返回值为 “super”。

我们现在支持变量和类变量的 READONLY 子句。这意味着必须在 Init() 方法(实例变量)或 InitClass() 方法(类变量)中分配变量。

 

其他方言的新特性

在 Visual Objects 中,您可以使用 INSTANCE 关键字声明字段,并添加与 INSTANCE 字段同名的 ACCESS/ASSIGN 方法。
在以前的 X# 版本中,不支持这一功能。
现在,编译器可以正确处理这种情况,在类的方法/属性内的代码中将名称解析为字段,在类外的代码中将名称解析为属性。

现在,PPO 文件包含用户定义命令和翻译的原始空白。

Bug 修复

修正了 VO 方言中的一些方法重载解析问题 (#1211)

修正了大量 DO CASE 语句和大量 IF ELSEIF 语句的内部编译器错误(堆栈不足) (#1214)。

修正了插值/扩展字符串语法的一个问题 (#1218)

修正了一些不正确的问题,允许使用冒号操作符访问静态类成员,或使用点操作符访问实例成员 (#1219,#1220)

修正了使用 MemVarPut() 创建的内存变量的错误可见性 (#1223)

修正了名称中带引号的 _DLL FUNCTION 无法正常工作的问题 (#1225)

如果预处理器生成了日期和/或日期时间字面量,则无法识别这些字面量。这一问题已得到修复 (#1232)

修正了预处理器匹配最后一个可选标记的问题 (#1241)

修正了在 Xbase++ 方言中识别 ENDSEQUENCE 关键字的问题 (#1242)

现在只有 USUAL 类型的参数才支持使用 NIL 的默认参数值。对其他参数类型使用 NIL 会产生(新的)警告 XS9117
此外,将 NIL 赋值给符号,或将 NIL 作为参数用于期望使用符号的函数/方法调用,现在也会产生警告 (#1231)。

修正了预处理器中的一个问题,即在结果流中两个相邻的标记没有合并为一个标记 (#1247)

修正了预处理器中的一个问题,即当元素以左括号开始时,预处理器无法检测到可选元素 (#1250)

修正了包含字面双引号的内插字符串的问题,如 i"SomeText""{iNum}"" "

修正了 2.16 早期版本中引入的局部函数/程序问题。

在解析时生成的警告可能会导致另一个关于预处理器定义的警告,即使在不需要预处理器定义的情况下也是如此。这一问题已得到修复。

修正了 2.16 早期版本中引入的以 “a := NIL,b := NIL as USUAL” 声明的参数的默认参数值问题

修复了 2.16 早期版本中调试器行为不稳定的问题。

当您引用外部程序集中的类型时,该类型依赖于另一个外部程序集,但您没有对该另一个外部程序集的引用,那么编译可能会失败,而没有适当的解释。现在,我们会产生一个正常的错误,提示您需要添加对其他程序集的引用。

对于没有 CLIPPER 调用约定的函数或方法,允许省略参数的类型。这些参数被假定为 USUAL 类型。
现在会产生一个新的警告 XS9118.

重大更改

如果您正在使用我们的解析器解析源代码,请检查您的代码。我们对处理 if ... else 语句和 case 语句的语言定义做了一些修改(两条规则共享一条新的 condBlock 规则)。这消除了语言中的一些递归。此外,还修改了一些 Xbase++ 的特定规则。请查看 language definition online

运行时

新特性

添加了 DOY() 函数。

添加缺失的 ADS_LONG 和 ADS_LONGLONG 定义.

提高了网络驱动器上 CDX 跳转操作的速度 (#1165)

Bug 修复

修正了 DbSetRelation() 和 RLock() 的一个问题 (#1226)

调整了从 NULL_PSZ 到字符串的隐式转换,现在返回 NULL 而不是空字符串。

部分初始化代码已从 _INIT 程序移至 SQLConnection 类的静态构造函数,以便更方便地在非 X# 应用程序中使用该类。

修正了使用 MemVarPut 函数创建的动态内存变量的可见性问题 (#1223)

修正了独占模式下 DbServer 类的一个问题 (#1230)。

从 NULL_PSZ 到字符串的隐式转换返回空字符串而非 NULL (#1234)。

修正了当日、月或年的前缀为空格时 CTOD() 函数中的一个问题。

修正了 ADS RDD 中 OrderListAdd() 的一个问题。当索引已打开时,RDD 不再返回错误。

修正了 MemRealloc 中的一个问题,即对同一指针的第二次调用将返回 NULL_PTR (#1248)

VOSDK

SDK 类中的全局数组现在由 SQLConnection 类的构造函数初始化,以解决主应用程序不包含 SQL 类程序集链接时出现的问题。

Visual Studio 集成

调试

调试器表达式计算器现在也能求值后期绑定的属性和字段(如果在项目中启用了编译器选项)。
如果这会产生负面影响,可以在 “工具/选项 调试/X# Debugger” 中禁用。

现在,调试器表达式计算器将使用主程序(如果该程序是 X# 项目)中的编译器选项进行初始化。
调试器选项对话框 上的设置现在仅在调试由非 X# 启动项目加载的 DLL 时使用。

对于实例字段、属性和方法,调试器表达式计算器现在总是接受 “.” 字符,与项目选项中的设置无关。
之所以需要这样做,是因为在向观察窗口添加表达式或更改属性或字段值时,VS 调试器中的几个窗口会自动插入 “.” 字符。

新特性

已添加对在 DbServer 编辑器中导入索引的支持。

X# 项目系统现在可以记住在设计模式下 Windows 编辑器中打开的窗口,并在重新打开解决方案时正确地重新打开它们。

我们为 Harbour 控制台应用程序和 Harbour 类库添加了模板。

我们为 FoxPro 语法类和 Xbase++ 语法类添加了项目模板。

FoxPro 和 XBase++ 方言的类模板现在包含该方言的类定义。

我们改进了 VS 编辑器对 PPO 文件的支持。

我们更新了部分项目模板。

Bug 修复

修正了编辑器中 “:=” 运算符的成员列表显示不正确的问题 (#1061)

修正了 VOMED 生成的菜单项 “定义” 名称与 VO 生成的名称不同的问题 (#1208)。

修正了 VOWED 在某些情况下生成的代码行顺序不正确的问题 (#1217)。

转回我们自己的 Mono.Cecil 版本,以避免在 Visual Studio 中有 Xamarin (MAUI) 工作负载的计算机上出现问题。

修正了在表单设计器中打开包含用函数调用初始化的字段的表单时出现的问题 (#1251)

关闭解决方案时处于 [设计] 模式的窗口,现在重新打开解决方案时可在 [设计] 模式下正确打开。

Changes in 2.15.0.3

编译器

新特性

使用 STACKALLOC 语法在堆栈(而非堆)上分配内存块 (#1084)

为 XBase++ 方法添加了 ASYNC 支持 (#1183)

Bug 修复

/allowdot 被禁用时,在使用点访问实例成员时,修正了一些特定情况下编译器缺失的错误 (#1109)

修正了通过引用传递参数的一些问题 (#1166)

修正了插值字符串的一些问题 (#1184)

修正了宏编译器无法检测错误访问静态/实例成员的问题 (#1186)

修正了 ELSEIF 和 UNTIL 语句错误信息中报告的行号不正确的问题 (#1187)

当启用 /cs 选项时,修正了在属性设置器内使用名为 “Value ”的 iVar 的问题 (#1189)

修复了缺少 Start() 函数时错误信息中报告的文件/行信息不正确的问题 (#1190)

修正了某些情况下关于模棱两可方法的错误警告 (#1191)

修正了嵌套方括号(在 SUM 和 REPLACE 命令中)的预处理器问题 (#1194)

修正了 VO 方言中某些情况下错误的方法重载解析 (#1195)

修正了 OBJECT/IntPtr 参数不正确的模糊调用错误 (#1197)

修正了在某些情况下跨步代码时调试不稳定的问题 (#1200#1202)

修正了一个问题,即当开始和结束之间的代码包含编译器警告时,ENDIF、NEXT、ENDDO 等 “结束关键字”的缺失不会被报告 (#1203)

修正了生成系统中的一个问题,即有时会显示关于不正确的 “RuntimeIdentifier” 的错误信息

运行时

Bug 修复

修正了 DBSort() 中的运行时错误 (#1196)

修正了 ConvertFromCodePageToCodePage 函数中的错误

更改 XSharp.RuntimeState 的启动代码可能导致代码页不正确

Visual Studio 集成

新特性

为 WED 添加了 VS 选项,以便使用乘法器手动调整生成资源中的 x/y 位置/大小 (#1199)

新增选项页面,用于控制编辑器在 Complete Word (Ctrl+Space)命令中查找标识符的位置。

对调试器表达式计算器进行了大量改进 (#1050)。请注意,该调试器表达式计算器仅适用于 Visual Studio 2019 及更高版本。

添加了调试器选项页面,用于控制新的调试器表达式计算器如何解析表达式。
您还可以更改这里的设置,禁止在调试时进行编辑。

我们为 Visual Studio 源代码编辑器添加了上下文帮助。当您按下符号上的 F1 键时,我们将检查该符号。如果符号来自 X#,我们将打开帮助文件中的相关页面。如果来自 Microsoft,我们将打开 Microsoft 在线文档中的相关页面。
在下一个版本中,我们可能会添加一个选项,让第三方也能注册他们的帮助集。

如果在编辑器中选择了属于代码块一部分的关键字,如 CASE、OTHERWISE、ELSE、ELSEIF,那么编辑器现在将高亮显示该代码块中的所有关键字。

跳转关键字 EXIT 和 LOOP 现在也作为其所属重复程序块的一部分突出显示。

在编辑器中选择 RETURN 关键字后,与之匹配的 “实体” 关键字(如 FUNCTION、METHOD)也会高亮显示。

在切换目标框架时,为 Application project options 页面添加了警告。

Bug 修复

当使用光标键在编辑器中移动到不同行时,修正了之前被破坏的自动同步大小写问题 (#722)

修正了使用 Control+Space 完成代码时的一些问题 (#1044, #1140)

修正了在某些情况下输入“:” 时的 intellisense 问题 (#1061)

修复了多行表达式(方法/函数调用)中的参数工具提示 (#1135)

修正了格式文档和 PUBLIC 修饰符的问题 (#1137)

修正了在同一文件中定义多个分部类时转到定义无法正常工作的问题 (#1141)

修正了自动缩进的一些问题 (#1142, #1143)

修正了调试时在新行开头不显示标识符值的问题 (#1157)

修正了某些情况下 LOGIC 的 intellisense 问题 (#1185)

修正了一个问题,即完成列表可能包含从显示完成列表的位置不可见的方法 (#1188)

修正了编辑器中嵌套类型的显示问题 (#1198)

清理了多个 X# 项目模板,修复了调试/输出文件夹位置不正确的问题 (#1201)

在 VS 编辑器中撤销大小写同步不起作用,因为编辑器会立即再次同步大小写 (#1205)

重建 intellisense 数据库不再重启 Visual Studio (#1206)

现在,“VO 菜单编辑器” 使用与原始 VO 应用程序中相同的菜单项 “定义值”(需要重新导入应用程序才能生效) (#1207)

对我们的项目系统和语言服务的更改可能会导致 Visual Studio 某些版本中的 “在文件中查找 ”功能被破坏。 这一问题已得到修复。

修正了转到定义对 protected 或 private 成员不起作用的问题

修正了一个问题,即对于某些文件,编辑器顶部的下拉组合框无法正确同步。

文档

更改

类型化 SDK 中的一些方法被记录为 Function。现在它们被正确地记录为 Method

类的 “属性列表” 和 “方法列表” 现在包括对继承自父类的方法的引用。不包括从 .Net 类继承的方法,如从 System.Object 继承的 ToString()。

Changes in 2.14.0.2, 3 & 4

Visual Studio 集成

Bug 修复

修复了在 VS 2017 中打开 PRG 文件时 X# 编辑器出现的异常

在有 XML 注释的条目后一行用回车键从完成列表中选择成员时,可能会在编辑器中插入额外的三斜线 (///) 字符。

插入 XML 注释的三斜线命令无法正常工作。现已修复。

修正了带前导 XML 注释的实体的实体分隔符未显示在正确行上的问题

修正了源代码中没有构造函数的类型的速览定义问题

修正了当关键字大小写不是大写时,执行接口操作的一个问题

修正了在当前行中过早同步关键字大小写的问题。

修正了 IF、DO WHILE 等关键字后的缩进问题

修正了调试时选择行尾字词的问题

修复了格式化文档可能锁定 VS 的问题

修正了 GET 和 SET 等访问器未在属性块内缩进的问题

修复了 “格式化文档” 在某些文档中不起作用的问题

更改了 VS 内部负责关键词着色和衍生任务的后台扫描的优先级。

Changes in 2.14.0.1

编译器

Bug 修复

修正了一个日期字面量问题,该问题会导致一条关于未知别名 “gloal ”的信息 (#1178)

修正了 AssemblyFileVersion 和 AssemblyInformationalVersion 中前导 0 字符丢失的问题。如果属性中没有通配符 “*”,则会保留这些前导零 (#1179)

运行时

Bug 修复

2.14.0.0 的运行时 DLL 标记了 TargetFramework 属性。这造成了一些问题。运行时动态链接库不再设置该属性 (#1177)

Changes in 2.14.0.0

编译器

Bug 修复

修正了当类型和局部变量具有相同名称时解析方法的问题 (#922)

改进了编译器隐式生成的方法(INIT、隐式构造函数)的 XML 文档消息 (#1128)

修正了带有默认参数值的 DELEGATE 的内部编译器错误 (#1129)

修正了获取结构元素指针时内存地址偏移计算不正确的问题 (#1132)

修正了 #pragma 警告指令无意中启用/禁用其他警告的问题行为 (#1133)

修正了调试时标记当前执行的完整代码行的问题 (#1136)

当声明全局内存变量时,修正了与 VO 值初始化不兼容的行为 (#1144)

修正了 DO 的编译器规则无法识别“&”操作符的问题 (#1147)

修正了与收缩转换警告有关的 ^ 操作符的不一致行为 (#1160)

修复了 CLOSE 和 INDEX UDC 命令的若干问题 (#1162#1163)

修正了错误 XS0161 报告的错误行:并非所有代码路径都返回值 (#1164)

修复了缺少 Start() 函数时错误信息中报告的错误文件名 (#1167)

UDC 中定义的命令的 PDB 信息现在会突出显示整行,而不仅仅是第一个关键字

修复了 CLOSE ALL 和 CLOSE DATABASE UDC 中的一个问题。

运行时

新特性

为 DbNotificationType 枚举添加了两个新值: BeforeRecordDeleted 和 BeforeRecordRecalled。还添加了 AfterRecordDeleted 和 AfterRecordRecalled,它们是已存在的 RecordDeleted 和 RecordRecalled 的别名 (#1174)

Bug 修复

已添加/更新 Win32API SDK 库中的若干定义 (#696)

修正了 “SkipUnique” 无法正常工作的问题 (#1117)

修正了当底部范围大于最高可用键值时的 RDD 范围问题 (#1121)

修正了 Win32API SDK 库中 LookupAccountSid() 函数的签名 (#1125)

改进了在索引表达式中尝试使用 Trim() 等函数(可改变键字符串长度)时的异常错误信息 (#1148)

修正了当 IIF 语句中存在赋值时出现的宏编译器运行时异常 (#1149)

修正了在后期绑定调用中解析正确重载方法的问题 (#1158)

修正了 FoxPro 方言中参数化 SQLExec() 语句的一个问题

修正了 Days() 函数中的一个问题,即使用了不正确的每日的秒数。

修正了 Advantage RDD 中的一个问题,即 FieldGet 返回的字段尾部有 0 字符。现在这些字符会被空格取代。

修正了 ADS RDD 中 DBI_LUPDATE 的一个问题

修复了调试器显示 USUAL 类型的问题。

Visual Studio 集成

新特性

现在使用 “引用管理器 ”而不是 “添加引用对话框 “ 来添加引用 (#21#1005)

在 “解决方案资源管理器” 上下文菜单中添加了一个选项,用于在 form.prg 和 form.designer.prg 中拆分 Windows 表单 (#33)

我们在工具/选项 TextEditor/X# 设置中添加了一个选项页,允许您启用/禁用 X# 源代码编辑器中的某些功能,如 “高亮显示单词”、“括号匹配 ”等。备份 Windows 窗体编辑器源代码的选项已从文本编辑器选项页移至自定义编辑器选项页。在 “工具/选项 ”对话框中搜索 “备份” 即可找到该设置。

所有源代码项目的工具提示现在都包含位置(文件名和行/列)

我们已在所有选项页面上添加了 “搜索关键字”。

Bug 修复

修正了当解决方案处于团队基础服务器 SCC 下时重命名文件的问题 (#49)

WinForms 设计器现在可忽略 form.prg 和 designer.prg 文件中指定的名称空间的差异(使用 form.prg 中的名称空间) (#464)

修正了某些情况下类的鼠标下工具提示不正确的问题 (#871)

修正了带有扩展方法的枚举类型的代码完成问题 (#1027)

修正了枚举的一些 intellisense 问题 (#1064)

修正了 VS 2022 中 Nuget 软件包导致首次尝试生成项目失败的问题 (#1114)

修正了 XML 文档工具提示中的格式问题 (#1127)

修正了在编辑器的代码完成列表中包含虚假的额外静态成员的问题 (#1130)

修正了转到定义、速览定义、QuickInfo 提示和参数提示中未包含扩展方法的问题 (#1131)

当在参数列表内使用 IIF() 等编译器伪函数时,修正了为参数提示确定正确参数编号的问题 (#1134)

修正了调试时在带下划线的编辑器中用鼠标双击选择单词的问题 (#1138)

修正了在调试时计算名称中含有下划线的标识符值的问题 (#1139)

修正了标识符高亮导致 VS 编辑器在某些情况下挂起的问题 (#1145)

修正了 WinForms 设计器中生成的事件处理程序方法的缩进 (#1152)

修正了 WinForms 设计器在添加新控件时重复字段的问题 (#1154)

修复了 WinForms 设计器移除 #region 指令的问题 (#1155)

修正了 WinForms 设计器删除 PROPERTY 声明的问题 (#1156)

修正了在某些情况下本地类型查找失败的问题 (#1168)

修正了代码中扩展方法的存在导致成员列表无法填充的问题 (#1170)

修正了在未选择项目的情况下完成成员完成列表时出现的问题 (#1171)

修正了在类的静态成员类型上显示成员完成度的问题 (#1172)

修正了单行实体(如 GLOBAL、DEFINE、EXPORT 等)后的缩进问题 (#1173)

修正了扩展方法的参数提示问题 (#1175)

修正了命名空间和嵌套类的工具提示问题 (#1176)

UDC 中的可选标记在源代码编辑器中未着色为关键字

修正了 CodeDom 提供程序中的一个问题,即在为 WPF 项目生成代码时,由于依赖 Microsoft.VisualStudio.Shell.Design 15.0 版本,因此无法在生成服务器上加载。

Changes in 2.13.2.2

编译器

Bug 修复

仅使用 INSTANCE 修饰符声明的类成员被生成为 public。现在已改为 protected,就像在 Visual Objects 中一样 (#1115)

运行时

Bug 修复

IVarGetInfo() 返回的 PROTECTED 和 INSTANCE 成员值不正确。此问题已得到修复。(#1116)

Default() 函数将以 NULL_OBJECT 初始化的 usual 变量更改为新值。这与 Visual Objects 不兼容 (#1119)

Visual Studio 集成

新特性

Rebuild Intellisense Database 菜单选项现在会在重启 Visual Studio 之前要求确认 (#1120)

现在可以隐藏解决方案资源管理器中的 “Include Files” 节点(工具/选项 X# Custom Editors/Other Editors)

Bug 修复

CATCH 子句中声明的变量的类型信息不可用。该问题已得到修复 (#1118)

修复了参数提示的几个问题 (#1098#1065)

修复了当光标位于 “global” 实体(如非常大的大型项目中的函数或过程)中的未声明标识符上时的性能问题

当 #include 语句的源代码包含相对路径时,“Include Files” 节点可能包含重复引用,例如
#include "..\GlobalDefines.vh"

在打开解决方案时,禁止在解决方案资源管理器中展开 “Include Files” 节点。

单字词(如 i、j、k)没有通过 “高亮显示单词 ”功能高亮显示

在 quickinfo 工具提示中,“ptr ”类型没有用关键字颜色标出

在关键字大小写上,nameof、typeof 和 sizeof 关键字不同步

Changes in 2.13.2.1

编译器

新特性

现在,解析器可以识别 PUBLIC 和 PRIVATE 内存变量声明中的 AS <type> 子句,但会忽略这些子句并发出警告

我们为使用 LPARAMETERS 声明的局部变量添加了 AS <type> 支持。函数/过程仍采用 clipper 调用约定,但局部变量采用声明的类型。

Bug 修复

在未选择 /memvar 编译器选项的情况下,PUBLIC 和 PRIVATE 关键字有时会被误解为内存变量声明。我们添加了解析器规则以防止这种情况发生:当未选择 /memvar 时,PUBLIC 和 PRIVATE 仅用作可见性修饰符

修复选择函数和方法重载时出现的问题 (#1096#1101)

2.13.2.0 版引入了一个问题,可能会导致超大源文件出现严重的性能问题。2.13.2.1 版已修复了这一问题。

 

运行时

Bug 修复

当运行时无法解决对重载方法的后期绑定调用时,它会产生一条包含所有相关重载方法列表的错误信息 (#875#1096)

为 FoxPro 方言添加的 .NULL. 相关行为破坏了涉及 usuals 的现有代码。在 FoxPro 方言中,DBNull.Value 现在被视为 .NULL.,但在其他方言中则被视为 NULL_OBJECT / NIL。

VFP 库中 PropertyContainer 类的几个内部成员现在是 Public 成员

Visual Studio 集成

Bug 修复

速览定义、转到定义等的查找代码过滤掉了实例方法,只返回静态方法。这一问题已得到修复 (#1111#1100)

为修复键入时的缩进问题而做的几处修改 (#1094)

修正了参数提示的几个问题 (#1098#1066#1110)

最近为支持将 packages.config 转换为软件包引用的向导所做的更改对在 Visual Studio 内生成过程中还原 nuget 的操作产生了负面影响。这一问题已得到修复。(#1113#1114)

修复了 CATCH、ELSEIF、FOR、FOREACH 等行中变量的识别问题 (#1118)

修复了默认命名空间中类型的识别问题 (#1122)

Changes in 2.13.1

编译器

新特性

FoxPro 方言中的 PUBLIC 和 PRIVATE 语句现在支持内联赋值,例如
PUBLIC MyVar := 42
除了名称为 “FOXPRO” 和 “FOX” 的变量外,没有初始化的 PUBLIC 值将是 FALSE。在 FoxPro 方言中,这些变量的初始化值为 TRUE

Bug 修复

修正了在 foxpro 方言中初始化 File Wide 公共文件的问题

对于复杂表达式,错误信息的列号不一定正确。这一问题已得到修复 (#1088)

修正了词法器中的一个问题,即当源代码包含跨多行的语句时(通过使用分号作为续行符),行号不正确 (#1105)

修正了当一个或多个重载有一个 Nullable 参数时重载解析的问题(#1106),例如
  class Dummy    
    method Test (param as usual) as int
     .
     method Test(param as Int? as int
     .
  end class

修正了在使用 /fox2 编译器编译选项(“兼容数组处理”)的 FoxPro 方言中,针对未知类型变量的后期绑定方法调用和/或数组访问的代码生成问题 (#1108)。
这样的表达式          
 
  undefinedVariable.MemberName(1)
 
被解释为数组访问,但也可能是方法调用。
现在,编译器生成的代码会调用运行时函数,在运行时检查 “MemberName” 是否是方法或属性。
如果它是一个属性,运行时将假定它是一个数组,并访问第一个元素。
包含 2 个以上参数或非数字参数的代码,如
 
  undefinedVariable.DoSomething("somestring")
 
不受影响,因为 “somestring” 不能是数组索引。
提示:不过,我们建议始终声明变量并指定其类型。这有助于在编译时发现问题,并能更快地生成代码。

 

运行时

新特性

添加了在运行时解决方法调用或数组访问的功能 (#1108)

为 XSharp.RT.Debugger 库中的工作区窗口(WorkareasWindow)添加了转到记录编号功能

Visual Studio 集成

新特性

现在,VS 项目树(在一个特殊节点中)显示项目使用的包含文件 (#906 )
这包括项目本身的包含文件,也包括 XSharp 文件夹或 Vulcan 文件夹中的包含文件(如适用)。

我们尽可能在项目树和其他几个位置使用 Visual Studio 的内置镜像。

现在,我们在 VS 中的后台分析程序会在生成过程中暂停,以减少对生成的干扰。

我们在缩进选项中添加了一个设置,这样您就可以控制类字段和属性的缩进,并将其与方法分开。
因此,您可以选择缩进字段和属性,而不缩进方法。这一点也已添加到 .editorconfig 文件中

Bug 修复

修正了 “速览定义” 和 “转到定义” 的问题

在查找函数时,我们有时会(意外地)将其他类中的静态方法也包括在内。

在解析 QuickInfo 和速览定义的标记时,如果方法名称之后和开放括号之前有空格,则无法找到方法名称。

修正了一个问题,即在保存时,项目范围内的资源和设置(从项目属性页面添加)无法获得文件后面的代码

调用构造函数的行上的 “快速信息 ”和 “转到 ”定义现在将显示/转到该类型的第一个构造函数,而不再显示/转到类型声明

当项目的生成过程因缺少资源或其他资源相关问题而失败时,错误列表不会正确更新。这一问题已得到修复 (#1102)

XSharpDebugger.DLL 未正确安装到 VS2017 和 VS2019 中。

Changes in 2.13

编译器

新特性

我们新增了一个编译器选项 /allowoldstyleassignments,允许在赋值时使用 “=” 运算符而不是 “:=”。
该选项在 VFP 方言中默认为启用,而在所有其他方言中默认为禁用。

我们修改了与数字转换有关的 /vo4/vo11 命令行选项的行为。
/vo4 之前,它只与整数之间的转换有关。现在,它已扩展到小数(如 float、real8、十进制和货币)和整数之间的转换。
在原始语言(VO,FoxPro)中,您可以将带有整数值的分数赋给变量而不会出现问题。
在.NET中,你不能这样做,但你必须在赋值时添加一个强制转换:

LOCAL integerValue as INT
LOCAL floatValue := 1.5 as FLOAT
integerValue := floatValue         // 无转换:如果不进行转换,将无法在 .Net 中编译
integerValue := (INT) floatValue   // 显式转换:可在 .Net 中编译
? integerValue
 
如果启用了编译器选项 /vo4,那么不带强制转换的赋值也能正常工作。
编译器选项 /vo4 增加了一个隐式转换
在这两种情况下,编译器都会发出警告:
warning XS9020: 将 “float ”缩小转换为 “int ”可能导致数据丢失或溢出错误
上述整数 integerValue 的值由 /vo11 编译器选项控制:
默认情况下,.Net 将小数值转换为整数值时,会四舍五入为零,因此值为 1。
如果启用编译器选项 /vo11,小数将四舍五入为最接近的偶数整数值,因此示例中 integerValue 的值将是 2。
这并不是什么新鲜事。
我们在 2.13 版中进行了修改,以确保 X# 数字类型的这种差异不再在运行时确定,而是在编译时确定。
在早期版本中,这个问题是由运行时中 FLOAT 和 CURRENCY 类型的转换运算符处理的。
这些类根据主程序中的 /vo11 设置选择四舍五入方法,该设置存储在 RuntimeState 对象中。
但是,当程序集使用 /vo11 编译,而主程序不使用 /vo11 编译时,可能会产生不必要的副作用。
例如,ReportPro 或 bBrowser 就可能出现这种情况。
如果这样一个程序库的作者现在选择使用 /vo11 进行编译,那么他可以肯定,他代码中的所有这些转换都将根据他的选择四舍五入为零或四舍五入为最接近的偶数整数。

编译时代码块的 DebuggerDisplay 属性已更改。现在你可以在调试器中看到编译时代码锁定的源代码。

Bug 修复

修正了 ASYNC/AWAIT 的代码生成问题 (#1049)

修正了 VFP 方言中 CODEBLOCK 的 Evaluate() 的内部编译器错误 (#1043)

修正了一个内部编译器错误,即在 END FUNCTION 语句后错误插入 UDC

修正了预处理器中嵌套包含文件中 #region 和 #endregion 的问题 (#1046)

修正了根据 DEFINE 出现的顺序计算 DEFINE 的一些问题 (#866#1057)

修正了嵌套 BEGIN SEQUENCE ... END SEQUENCE 语句的编译器错误 (#1055)

修正了包含复杂表达式的代码块的一些问题 (#1056)

当启用 /undeclared+ 时,修正了将函数分配给委托的问题 (#1051)

修正了在 Fox 方言中定义 LOCAL FUNCTION 时的错误警告 (#1017)

修正了 FLOAT 值上的 Linq 操作 Sum 的一个问题 (#965)

修正了在匿名方法/lamda 表达式中使用 SELF 的问题 (#1058)

修正了将一个 Usual 转换为定义为 DWord 的 Enum 时的 InvalidCastException (#1069)

修正了在调用带有参数 nStart 的 AScan() 和类似函数时发出的错误代码 (#1062, #1063)

修正了解决跨不同程序集的同一函数的正确表单重载的问题 (#1079)

修正了针对特定 XBase++ 代码的 #translate 预处理器的意外行为 (#1073)

修正了 “ARRAY OF ”意外行为的问题 (#885)

修正了调用接受 ARRAY 作为第一个参数的函数的特定重载时出现的一些问题 (#1074)

当在方法上使用 PUBLIC 关键字时,修正了一个假的 XS0460 错误 (#1072)

修正了启用 “命名参数” 选项时的不正确行为 (#1071)

修正了调用带有默认值 DECIMAL 参数的函数/方法时的 Access 违规行为 (#1075)

修正了预处理器中 #xtranslate 无法识别正则匹配标记的一些问题。还修正了在预处理器中识别表达式标记内的双冒号(::)的问题。(#1077)

修复了在 VFP 方言中声明数组的一些问题 (#848)

 

运行时

Bug 修复

修正了 Mod() 函数中与 VO 的一些不兼容问题

修正了当维度不匹配时,在 VFP 方言中复制到数组时出现的异常 (#993)

修正了 SetDeleted(TRUE) 和 DESCEND 排序的寻道问题 (#986)

修正了 DataListView 在使用 SetDeleted(TRUE) 时错误显示(空)已删除记录的问题 (#1009)

修正了使用 SYMBOL 参数时 SetOrder() 失败的问题 (#1070)

还原了 SDK 中 DBServer:FieldGetFormatted() 先前的一处错误更改 (#1076)

修正了 StrEvaluate() 的若干问题,包括无法识别名称中含有下划线的 MEMVAR (#1078)

修复有关 InList() 和字符串值的问题 (#1095)

为了与 FoxPro 兼容,Empty() 函数现在对 .NULL. 值和 DBNull.Value 的值返回 false。

修正了 GetDefault()/ SetDefault() 的一个问题,使其与 Visual Objects 兼容 (#1099)

 

新特性

增强 Unicode AnyCpu SQL 类 (#1006)

已添加以只读模式打开 Sqlselect 的属性。这将防止 Append()、Delete() 和 FieldPut() 等操作。

延迟创建 InsertCmd、DeleteCmd、UpdateCmd,直到真正需要时为止

添加了回调机制,客户可以覆盖这些命令的命令文本(例如,将它们路由到过程)。

当由于方法重载而无法解决后期绑定的方法调用时,现在会生成更好的错误信息,其中还包括找到的方法的原型 (#1096)

 

 

FoxPro 方言

添加了 ADatabases() 函数

Visual Studio 集成

新特性

现在,您可以通过 工具/选项文本编辑器/X# 选项 页面控制缩排方式。我们添加了多个选项来控制源代码的缩进。如果你想在公司内部执行缩进规则,也可以通过 .editorconfig 文件设置这些选项。

我们现已在源代码编辑器中添加了大量代码格式化选项。有关可用选项,请参见 工具/选项/文本编辑器/X#/缩进 (#430)

我们实施了 “标识符大小写同步” 选项。其工作原理如下: 编辑器会拾取源文件中首次出现的标识符(类名、变量名等),并确保同一源文件中所有其他出现的标识符都使用相同的大小写。这不会在源文件中强制使用大小写(那样会太慢)

我们在 VS 颜色对话框中为匹配大括号、匹配关键字和匹配标识符添加了颜色设置。打开 “工具/选项 ”对话框,选择 “环境/字体和颜色”,然后在列表框中查找以 “X#”开头的颜色。您可以根据自己的喜好自定义这些颜色。

使用 Vulcan 运行时的 X# 项目现在有了一个上下文菜单项,可以将其转换为 X# 运行时。标准 Vulcan 程序集将被替换为等效的 X# 运行时程序集。如果使用第三方组件,如 bBrowser 或 ReportPro,则需要自行替换这些组件的引用(#32)。

我们在项目属性的语言页面中添加了一个选项,用于为编译器设置新的 /allowoldstyleassignments 命令行选项

 

Bug 修复

修正了 TFS 下解决方案的 “获取最新版本” 问题 (#1045)

修正了 WinForm 设计器更改 main-prg 文件格式的问题 (#806)

修正了 WinForms 设计器中代码生成的一些问题 (#1042, #1052)

修正了 DO WHILE 的格式问题 (#923)

修正了灯泡 “生成默认构造函数” 功能的问题 (#1034)

修复了调试器中工具提示的问题。现在我们解析从第一个标记到光标位置的完整表达式。(#1015)

修正了使用 VAR 定义的 .Net 数组局部的一些剩余的 intellisense 问题 (#569)

修正了缩进在某些情况下无法正常工作的问题 (#421)

修正了自动排版的一个问题 (#919)

关键字配对匹配的若干改进 (#904)

修正了在 “ClassName{}”中输入圆点后,代码完成也会显示静态成员的问题 (#1081)

修正了键入 .and. 时的性能问题。(#1080)

修复了类型化新类/方法时导航栏的问题 (#1041)

修正了关键字上不正确的信息工具提示 (#979)

修正了使用 “清理解决方案” 时可能出现的 VS 冻结问题 (#1053)

修正了表单设计器中事件处理程序中的圆点位置不正确的问题 (#1092)

修复了表单设计器在创建新表单后无法打开表单的问题 (#1093)

右键单击 packages.config 文件并选择 “迁移到 packagereferences ”选项不起作用,因为 Visual Studio 内部有一个硬编码的支持项目类型列表。我们现在要 “伪造” 项目类型,让 VS 满意并启用向导。

生成系统

在 VS 中编译 X# 项目时,负责创建命令行的 XSharp.Build.Dll 无法正确地将 /noconfig/shared 编译器选项传递给编译器。因此,即使启用了使用共享编译器的项目属性,也无法使用共享编译器。此外,编译器还会自动包含对 xsc.rsp 文件中列出的所有程序集的引用,该文件位于 XSharp\bin 文件夹中。
您现在可能会遇到程序集因缺少类型而无法编译的情况。如果您使用的类型位于 xsc.rsp 中列出的程序集内,就会出现这种情况。您现在应该在 X# 项目中添加对这些程序集的明确引用。

Changes in 2.12.2.0

编译器

Bug 修复

修正了代码生成中的一个错误,以处理带括号索引的 FoxPro 数组访问 (#988, #991)

编译器会对使用 IS 声明的 locals 生成错误的警告。现已修复。

编译器未就 ACCESS/ASSIGN 上 OVERRIDE 修饰符的无效使用报告错误,现已修复 (#981)

修正了从各种数字数据类型转换为另一种数据类型时,在报告警告和错误的几种情况下的不一致行为 (#951#987)

修正了 iif() 语句在某些情况下出现的 “failed to emit module ”问题 (#989)

修正了编译 X# 代码脚本时出现的问题 (#1002)

修正了在宏编译器中为某些特定程序集使用类的问题 (#1003)

修复在 AnyCPU 模式下向指针添加 INT 时的错误信息 (#1007)

修正了将 STRING 转换为 PTR 语法的问题 (#1013)

修正了向 CLIPPER 函数/方法传递单个 NULL 参数时 PCount() 的一个问题 (#1016)

新特性

我们已在所有方言中添加了对 TEXT ... ENDTEXT 命令的支持。请注意,该命令有多种变体。其中一种变体适用于所有方言(TEXT TO varName)。其他变体取决于所选择的方言。我们已将对 TEXT ... ENDTEXT 的支持从编译器转移到预处理器。这意味着还有 2 个新的预处理器指令: #text#endtext (#977, #1029)

启用了新的编译器选项 /vo17,为 BEGIN SEQUENCE...RECOVER 命令实现了与 VO 更为兼容的行为 (#111#881#916):

o对于包含 RECOVER USING 的代码,将检查是否存在封装异常。如果异常不是封装异常,运行时将调用一个函数(FUNCTION _SequenceError(e AS Exception) AS USUAL)来处理该错误。例如,它可以调用错误处理程序,或抛出错误

o如果没有 RECOVER USING 子句,编译器就会生成一个子句,并在生成的子句中检测 RECOVER 是在包裹异常还是正常异常的情况下完成的。对于包裹异常,编译器会获取值并在运行时调用一个特殊函数(FUNCTION _SequenceRecover(uBreakValue AS USUAL) AS VOID)。如果在调用生成的恢复时出现了 “正常 ”异常,则会调用上一小节中的 _SequenceError 函数。

我们新增了对 CCALL() 和 CCALLNATIVE() 的支持

#pragma 指令现在由预处理器处理。因此,您可以在代码的任何地方添加 #pragma 行:实体之间、实体内部等。

运行时

Bug 修复

更改了 AdsGetFTSIndexInfo 的原型 (#966)

修复了 TransForm 和十进制类型的一个问题 (#1001)

在 VFP 程序集中添加了几种缺失的返回类型

修正了在 FoxPro 方言中浏览 DBFVFP 表的问题

修正了处理 BREAK 命令在 BEGIN...RECOVER 周围语句中提供的值时的不一致性,这取决于使用的是早期还是晚期绑定调用 (#883)

修正了将 System.Decimal 值赋值给 USUAL 变量时浮点格式的问题 (#1001)

在 FoxPro 方言中,当复制到列数多于表列数的数组时,修正了 DbCopyToArray() 的运行时错误 (#993)

修正了宏编译器中带有 +/- 符号的类型转换表达式和数字字面的问题 (#1025)

修正了后期绑定代码中的问题,即字符串有时会被传入,但不会正确转换为符号

IVarPut()/IVarGet() 现在会在尝试使用不可访问(由于限制可见性修饰符)的属性 getter/setter(ACCESS/ASSIGN)时抛出适当的异常 (#1023)

修正了使用 NEW 修饰符在子类中重新定义属性时,IVarGet() 和 IVarPut() 的一个问题 (#1030)

删除或调用记录时,DbDataSource 现在会尝试锁定记录

Foreach 无法在包含从 IVarGet() 等后期绑定属性访问返回的集合的属性上正确工作(#1033)

新特性

现在,您可以在运行时状态中注册一个委托,从而控制宏编译器如何缓存已加载程序集的类型 (#998)。
该委托必须具备以下格式:
 
DELEGATE MacroCompilerIncludeAssemblyInCache(ass as Assembly) AS LOGIC
 
例如:
 
XSharp.RuntimeState.MacroCompilerIncludeAssemblyInCache := { a  =>  DoNotCacheDevExpress(a)}
FUNCTION DoNotCacheDevExpress(ass as Assembly) AS LOGIC)
  // 不缓存 DevExpress 程序集
  RETURN ass:Location:IndexOf("devexpress", StringComparison.OrdinalIgnoreCase) == -1

兼容 VO SDK

修正了 SetAnsi(FALSE) 导致带图片的单行编辑控件在输入缩略语时显示随机字符的问题 (#1038)

Typed VO SDK

SQLSelect 类有两个新属性。

ReadOnly - 使 SQLSelect 变成只读

BatchUpdates - 控制如何处理更新

只读 CURSOR 和延迟创建 command 对象

以前,SQLSelect 类会创建 DbCommand 对象,以便在打开结果集时立即更新、插入和删除对游标所做的更改。

当使用复杂查询选择数据时,这可能会导致问题,因为 DbCommandBuilder 对象无法确定如何创建这些语句。

现在,我们将这些命令的创建时间推迟到第一次需要时。

同时,我们还添加了一个只读属性,默认值为 FALSE。

如果将 ReadOnly 设置为 true,那么

调用 FieldPut()、Delete() 和 Append() 将产生 Gencode EG_READONLY 错误。

不会为 SQLSelect 创建 Command 对象,因为游标无法更新。

如果只读保持 FALSE,那么更新、插入和删除的命令对象将在第一次需要时创建。

这些命令是在 __CreateDataAdapter() 方法中创建的。

您可以重写该方法,并在需要时在自己的子类中创建命令。

命令创建和更新的工作原理如下:

首先,使用 SQLFactory 类中的 CreateDataAdapter 方法创建数据适配器(DbDataAdapter 类型)

然后,通过 SQLFactory 类的 CreateCommandBuilder 方法创建一个 CommandBuilder 对象( DbCommandBuilder 类型)

然后通过 DbCommandBuilder 对象的 GetInsertCommand() 等方法创建插入、删除和更新命令对象(均为 DbCommand 类型)。DBCommandBuilder 对象接收 Select 语句,并根据 SQLSelect 命令创建带参数的命令

这些命令对象被分配给 DataAdapter,然后以 SQLSelect 后面的 DataTable 作为参数调用 DataAdapter:Update() 方法。

批量更新

通常,SQLSelect 中的更新会在将记录指针移动到新行或调用 Update() 时发送到服务器。

如果将 BatchUpdates 属性设置为 “true”,那么 SQLSelect 将延迟向服务器发送更新,并且不会在每次移动记录时发送更新,而是等到调用 Update() 方法时才发送更新,参数为 “true”。这将把所有缓冲的更改写入服务器。这也会触发 DBCommand 对象的创建(见前文)。

如果您的表有自动递增字段,那么您可能需要在之后调用 Requery() 来查看新分配的键值。

Visual Studio 集成

Bug 修复

修复了针对带有不同风味的项目的项目属性页面处理 (#992)

尝试使用不存在的工作目录或程序文件名启动调试器时,现在会显示适当的错误 (#996)

修正了表单设计器有时使用 #区域生成无效代码的问题 (#1020#935)

WinForms 设计器现在默认在生成的 Dispose() 方法中添加 OVERRIDE 关键字修改器(已在模板中添加) (#1004)

由于最新发布的 VS2022 中的线程模型发生了变化,错误信息有时不会显示在输出窗口和错误列表中。这一问题已得到修复

修正了窗口窗体设计器代码生成中主窗体类内嵌套类的问题 (#1031)

修正了 windows 表单编辑器无法打开带有基于 UDC 的命令的表单的问题 (#1037)

源代码编辑器

全名的类型查找有时会失败,因为全名被定义为区分大小写(#978

嵌套类型查找有时会失败。现已修复。

缩进选项现在也可以在 .editorconfig 文件中重写(#999

当编辑器加载源文件时,直到光标在缓冲区中移动之前,类型和成员的组合框才会被激活。(#995)

编辑器中的成员组合框容易与包含本地函数或本地过程的代码混淆。

修正了转换或带关键字的转换(如 DWORD( SomeExpression))中表达式的查找问题。转换括号内的表达式没有快速信息提示(#997)

修正了 DATATYPE(<expression>) 转换表达式的 intellisense 问题 (#997)

修正了在属性实现中使用 => 符号声明属性时导致导航栏内容不完整的问题 (#1008)

修复了代码折叠和格式化中的几个问题 (#975)

修正了在参数列表内键入逗号不会调用参数工具提示的问题(#1019)

修正了检测 VAR 关键字的变量类型时出现的一些问题 (#903)

修正了在字符串字面内部输入“: ”或“. ”时的 intellisense 问题 (#1021)

修正了未知标识符有时会导致显示假成员完成列表的问题 (#1022)

在编辑器中按 CTRL+SPACE 现在总是调用代码完成列表 (#957)

新特性

在 VOWED 中添加了在选项卡控件中插入页面和重新排序页面的选项 (#1024)

我们更新了 WPF 应用程序模板。主窗口现在称为 “MainWindow”。

在 .editorconfig 文件中添加了以下新设置,以设置缩进选项 (#999)。

indent_entity_content (true or false)

indent_block_content (true or false)

indent_case_content (true or false)

indent_case_label (true or false)

indent_continued_lines (true or false)

 

VOXporter

如果在 VO 应用程序中启用了允许 MEMVAR/Undeclared vars 编译器选项,VOXporter 现在可以正确启用或禁用这些选项 (#1000)

Changes in 2.11.0.1

编译器

Bug 修复

修正了 CLIPPER 调用约定委托时的内部编译器错误 (#932)

修正了在运行时使用 usual 属性上的 null 运运算符 ?. 时出现的 AccessViolationException 异常 (#770)

[XBase++ 方言] 修正了带括号方法声明的解析问题 (#927)

[XBase++ 方言] 修复了解析 ANNOUNCE 和 REQUEST 语句(在 X# 中已过时)时出现的问题 (#929)

[XBase++ 方言] 修正了 INLINE ACCESS 和 ACCESS ASSIGN 语句的解析问题 (#926)

[VFP 方言] 修正了一个问题,即在解析包含 “M. ”变量用法的 FOR EACH 语句时,变量未在 FOR EACH 行中类型化 (#911) 。

修正了当一个 UDC 产生多个声明时,PPO 文件包含两次某些输出的问题 (#933)

修正了几个 UDC 中 “FIELDS ”子句的一些问题 (#931#795)

修正了预处理器中 #xtranslate 指令中括号的问题 (#963)

修复了 #command 和 #translate 指令的多个问题 (#915)

在某些情况下,编译器在从一种类型 casting/converting 为不兼容类型时,会产生不会抛出运行时异常的代码。该问题已得到修复(#961#984)

编译器在某些情况下未报告收缩转换警告,现已修复(#951)

编译器未报告有符号/无符号转换警告。该问题已得到修复(#971)

修正了一个可能导致 “Could not emit module” 错误信息的问题,该问题由 IIF() 表达式中的 NULL 值引起(#989)

新特性

添加了编译器选项 /noinit ,以便不为没有 INIT 过程的库生成 $Init 调用,从而推迟加载 (#854)

已添加 #stdout#if 的预处理器支持 (#912)

现在 #include 文件的全部内容都会写入 ppo 文件 (#920)

如果因标识符被同名定义替换而导致解析器出错,编译器现在会生成第二个警告。

如果头文件包含实际代码,并且在调试过程中调用了这些代码,那么调试器在调试这些代码时就会进入头文件。
以前,所有语句都从包含头文件的地方链接到 #include 行。(#967)

使用 /vo11 (兼容数字转换)编译器选项抑制编译器错误时,现在会看到一个 XS9020 “收缩”警告,表明可能会发生运行时错误或丢失数据。

当使用 /vo4 抑制有符号整数和无符号整数之间的转换错误时,现在会出现 XS9021 警告,表示可能会丢失数据或发生溢出错误。

Visual Studio 集成

新特性

源代码编辑器现在还支持新的 #if 和 #stdout 预处理器命令 (#912)

有了新的 “灯泡 ”选项,可以为类生成构造函数。

Bug 修复

修正了在项目属性中指定自定义预处理器定义的问题(#909)

在生成代码时,VO 风格编辑器现在保留了方法/构造函数的现有 “CLIPPER ”子句 (#913)

修正了类之间相互嵌套的错误解析 (#939)

修正了在项目设置中使用 $(SomeName) 形式的嵌入式变量的问题 (#928)

修正了从项目中删除项目项会失败的问题。

修正了一个问题,即如何解析由其他开发语言的项目文件生成的 DLL,尤其是 SDK 风格的 C# 项目 (#950)

修正了在出现无法识别的标识符后快速信息工具提示的问题 (#894)

修正了编辑器在自动键入属性后错误添加括号的问题(#974)

修正了在 #endif 指令后创建新行时编辑器反应极慢的问题 (#970)

修复了 .Net 数组类型的一些 intellisense 问题 (#569)

修复了设计时 DevExpress DocumentManager 控件的一个问题 (#976)

当 “显示来自......的输出 ”设置为 “扩展 ”时,修正了输出窗口中的参数为空异常 (#940)

运行时

新特性

为 array 类添加了 IEnumerable 构造函数 (#943)

实现了缺失的函数 AdsSetTableTransactionFree() 和 AdsGetFTSIndexInfo() (#966)

将函数 GetRValue()、GetGValue() 和 GetBValue() 从 Win32API 库移至 XSharp.RT,以便 AnyCPU 代码可以使用它们 (#972)

[VFP 方言] 实现了函数 APrinters() (#952)

[VFP 方言] 实现函数 GetColor() (#973)

[VFP 方言] 实现函数 Payment()、FV() 和 PV() (#964)

[VFP 方言] 实现了 MKDIR、RMDIR 和 CHDIR 命令 (#614)

Bug 修复

修复了 SDK 中 ListView TextColor 和 TextBackgroundColor ACCESSes 的一个问题 (#896)

修复了软查找在发现 strict  键时不尊重顺序范围的问题 (#905)

修正了 DBUseArea() 对不同文件夹中文件的搜索逻辑。此外,SetDefault() 不再使用当前目录初始化(为了兼容 VO)(#908)

修正了创建长度大于 255 的字符字段的 dbfs 问题 (#917)

修正了在某些情况下缓冲读取系统在读取、关闭、覆盖然后重新打开 dbf 时出现的问题 (#968)

修正了一个 VO 兼容性问题,即当打开索引文件时,DBSetIndex() 如何更改活动顺序 (#958)

修正了当源文件和目标文件结构相同并包含备注文件时,数据库追加、复制等操作的一个问题(#945)

修正了在索引文件不存在或未打开的情况下 DBOrderInfo(DBOI_ORDERCOUNT) 的错误结果 (#954)

[VFP 方言] 为 Program( [,lShowSignature default=.f.] ) 添加了可选参数 (#712)

[VFP 方言] 修复了 Type() 函数的几个问题(#747#942)

[VFP 方言] 修正了 ExecScriptFast() 的一个问题 (#823)

[VFP 方言] 修正了 SQLExec() 不能将记录指针放在第一条记录上的问题 (#864)

[VFP 方言] 修正了 SQLExec() 在使用 null 值时的一个问题 (#941)

[VFP 方言] 修正了从 SqlExec() 返回的缓冲区中的写入错误 (#948)

[VFP 方言] 修复了 DBFVFP RDD 和 null 列的一个问题 (#953)

[VFP 方言] 修正了 SCATTER TO 和 APPEND FROM ARRAY 的一个问题 (#821)

Typed SDK

修正了标准打开对话框中文件名属性的一个问题

修正了菜单构造函数中的 FOREACH 会导致处理异常的问题

RDD

Bug 修复

修正了 DBFVFP RDD 中计算 nullable 键的键值大小的问题 (#985)

VOXporter

Bug 修复

修正了错误检测字面字符串和注释中函数指针的问题 (#932)

 

Changes in 2.10.0.3

编译器

Bug 修复

修正了 FoxPro 方言中 COPY TO ARRAY 命令的一些问题 (#673)

修正了在 SWITCH 语句中使用 System.Decimal 类型的问题 (#725)

修正了 FoxPro 方言中 Type() 的内部编译器错误 (#840)

修正了生成 XML 文档的问题(#783#855)

启用 /vo3(所有成员均为虚拟)时,防止 SEALED 类成员出现警告 (#785)

修正了将 “ARRAY OF <type>”变量赋值和比较 NULL_ARRAY 的问题 (#833)

修正了使用 @ 操作符通过引用传递参数和/或将其用作 AddressOf 操作符时的一些问题(#810#899#902)

修正了当函数/方法的参数为指针类型时,使用 @ 运算符解析通过引用传递的参数的问题(#899#902)

新特性

添加了编译器选项(-enforceoverride) 以便在覆盖父成员时强制修改 OVERRIDE(#786#846)

在非本地上下文中使用 String2Psz() 和 Cast2Psz() 时,编译器会报错(因为这些 PSZ 会在退出当前实体时被释放) (#775)

函数过程现在支持 ASYNC 修饰符 (#853)

现在,您可以通过编译器命令行参数 -noinit 来抑制 $Init1() 和 $Exit() 函数的自动生成 (#854)  
VS "属性" 对话框尚未支持该选项

为 USUAL 变量也添加了对 ASTYPE 运算符的支持 (#857)

允许在 PUBLIC var 声明中指定 AS <type> 子句(编译器忽略,但编辑器将来会用于 intellisense)(#853)

AS <datatype> OF <classlib> 子句现在也支持其他几个 FoxPro 兼容命令,如 PARAMETERS 和 PUBLIC。
由于这些变量在运行时是无类型的,因此编译器会忽略该子句并发出警告。

生成系统

Bug 修复

在 X# WPF 项目上运行 MsBuild 可能会失败 (#879)

Visual Studio 集成

新特性

我们为 VS 2022 添加了 Visual Studio 集成

我们新增了对软件包引用的支持

现在,当用户键入“///”时,编辑器会自动插入 XML 注释。(#867, #887)  条件:

o        光标必须位于实体开始前的一行上

o        光标不得位于注释行之前

现在,类的工具提示还包括有关父类和已实现接口(如果有)的信息 (#860)

我们为编译器内置的伪函数(如 PCount() 和 String2Psz())添加了工具提示、参数补全等功能。

我们添加了第一个版本的灯泡提示。现在,我们只需实现缺失的接口成员,并将字段转换为属性。更多实现和配置选项将陆续推出

我们添加了一个新对话框来配置源代码格式,并提供了选项效果的可视化示例。

我们增加了将 X# VS 集成的操作记录到 Windows 调试窗口和/或日志文件的功能。
如果您遇到无法解释的问题,我们会与您联系,告诉您如何启用这些选项,这样您就可以向我们发送日志文件,显示在 Visual Studio 内部出现问题之前发生了什么。我们为此使用了 Serilog。

高亮显示单词功能现在不区分大小写,不再高亮显示注释、字符串或非活动编辑器区域中的单词。

我们在编辑器中加入了 "括号补全"

Bug 修复

修复了格式化文档命令的一些问题(#552)

修复了参数工具提示的几个问题(#728#843)

修正了代码完成列表显示未定义的变量/标识符的问题 (#793)

修正了链式表达式的成员补全和参数工具提示 (#838)

修正了某些情况下对 VAR 本地变量类型的识别 (#844)

修正了 VOSTRUCT 变量的成员完成和工具提示信息问题 (#851)

修正了忽略 XML 注释中换行符的问题 (#858)

修正了一些有关 CHAR 属性的 WinForms 设计器问题 (#859)

修正了调用 SUPER() 构造函数时转到定义无法正常工作的问题 (#862)

当解决方案路径中包含空格时,修复了重建 intellisense 数据库命令的错误 (#865)

当同时运行多个 VS 版本时,外部程序集类型的转到定义失败。

修正了 VOSTRUCT 有时会混淆解析器的问题 (#868)

修正了更多有关 quickinfo 和成员完成的问题 (#870)

修正了 Windows 窗体设计器中的一个问题 (#873)

修正了不使用 MEMBER 关键字的 ENUM 的智能感应问题 (#877)

修正了继承 exception 类型的成员完成问题 (#884)

如果 XML 主题有 <see> 或其他类型的子元素,则编辑器中不会显示这些子元素。这一问题已得到解决 (#900)

在编辑器中,不平衡的大括号有时会与关键字匹配。这一问题已得到修复 (#892)

分隔线有时会闪烁。这一问题已得到修复(#792)

在解析局部变量时,我们没有处理包含文件。这可能导致在条件块 (#ifdef SOMEVAR) 中声明的局部变量找不到。这一问题已得到修复。现在,即使在解析源文件的一部分时,编辑器解析器也会包含头文件以及代码中的 #defines 和 #undefines (#893)

#include 行现在包含在编辑器的字段/成员组合框中(当字段显示时)。它们也会保存到 intellisense 数据库中。

当光标停留在非活动预处理器区域 (#ifdef) 上时,编辑器会尝试显示 QuickInfo 工具提示。现在这种情况不再发生。

运行时

Bug 修复

修复了同时更新时可能出现的 DBFCDX 损坏问题 (#585)

修正了打开带有允许 NULL 字段索引的 FoxPro 表的问题 (#631)

BlobGet() 函数返回的是逻辑值而不是实际字段值 (#681)

在索引表达式中有大量字段的情况下,创建索引的速度大大提高 (#711)

修正了 FieldPutBytes() 和 FieldGetBytes() 的一些问题 (#797)

在某些情况下,带有第三个参数 (lLast) TRUE 的 DBSeek() 行为不正确 (#807)

修复了创建索引时可能发生的 NullreferenceException 异常 (#849)

改进了 Error.WrapRawException() 方法生成的文本的缩进(#856)

修正了.Net Array <-> USUAL 转换时的运行时问题(#876)

即使不支持信息枚举,DbInfo() 也会返回 TRUE (#886)。

还修正了 DBFNTX 可能损坏的问题 (#889)

在 FoxPro 中,当代码块返回 NIL 或 VOID 时,DbEval() 可能会失败 (#890)

修复了 Softseek 和降序索引的一个问题。

修正了范围表达式不正确可能导致意外结果的问题。现在,服务会在范围不正确的情况下进入(并停留在)EOF。

修正了在宏表达式中使用括号运算符访问 FoxPro 数组的问题(#805)。
请注意,要使主程序正常运行,必须在编译主程序时使用 /fox2

 

Changes in 2.9.1.1 (Cahors)

编译器

Bug 修复

修正了 2.9.0.2 中引入的一个问题,即定义符号在与 /vo8 编译器选项结合使用时不遵守 /cs 编译器选项 (#816)

当启用 /fox2 编译器选项时,修正了对象初始化器内部赋值表达式的内部编译器错误 (#817)

修正了 VOSTRUCTs 中日期的一些问题 (#773)

修正了预处理器中的一个问题,即在 UDC 中间使用 FIELDS <f1> [,<fn> ] 这样的列表规则时会出现这个问题。

修正了 SET CENTURY &cOn 等 UDC 的编译问题,因为 cOn 不是作为标识符而是作为关键字进行解析的。

新特性

预处理器中有一个新的结果标记(NotEmpty 结果标记),它的作用与常规结果标记相同,但在输入中找不到匹配标记(可选)时,会向输出写入一个 NIL 值。
由于 IIF 表达式内部的部分可能不是空的,因此当您想将结果作为 IIF() 表达式的一部分输出时,可以使用此方法。
结果标记如下 <!marker!>

以前不允许在 UDC 中使用受限匹配标记作为第一个标记。这一问题已得到解决。现在可以编写这样的规则,它将输出关键字(SCATTER、GATHER 或 COPY),然后是经过字符串化的选项列表。

#command <cmd:SCATTER,GATHER,COPY> <*clauses*> => ?  <"cmd">, <"clauses">
FUNCTION Start AS VOID
   SCATTER TO TEST   // 被预处理为 ? "SCATTER" , "TO TEST"
  RETURN

Visual Studio 集成

Bug 修复

修正了 2.9.0.2 中引入的 WPF 项目代码生成问题 (#820)

修正了生成后 VS 冻结的问题 (#819)

修正了包含 SELF 属性的源文件的代码折叠和导航栏的一些问题 (#825)

修复了表单设计器在表单 prg 包含嵌套类时发出无效代码的问题 (#828)

修正了一个问题,即代码自动完成功能在打开左侧结尾括号时显示错误的成员 (#826)

修复了点击泛型类时 VS 崩溃的问题 (#827)

修正了 SET CENTURY &cOn 等表达式的关键字着色问题,在这些表达式中,&cOn 用关键字颜色着色。

嵌套函数调用的参数提示需要在嵌套函数名称前多留一个空格 (#728)

修复了表单设计器删除 form.prg 中委托和其他嵌套类型的问题 (#828)

在 ClassView / ObjectView 窗口中加载类型的后台程序降低了 VS 的性能。目前已将其禁用。

修复了泛型的类型查找。

将鼠标悬停在构造函数关键字上显示的是类的工具提示,而不是构造函数的工具提示。这一问题已得到修复。

修正了 Windows 窗体代码生成器中的一个问题,即带有特殊值的字面字符(如“\0”) (#859)

修正了在后台初始化项目系统时(例如没有打开 X# 项目时)项目系统出现的异常 (#852)

修复了 LONGINT 和 SHORTINT 关键字的代码自动补全缺失 (#850)

上下文菜单选项 “在反汇编器中查看 ”现在只针对 X# 项目显示

修正了 ARRAY OF <type> 的代码生成器问题 (#842)

修复了在编辑器中点击代码时的性能问题 (#829)

修正了在查找嵌套类型失败时加载 Windows 窗体的问题。

 

新特性

我们在解决方案资源管理器的项目上下文菜单中添加了一个上下文项,用于编辑项目文件。这将在需要时卸载项目,然后打开文件进行编辑。

现在,“工具/XSharp ”菜单中的 “重建 intellisense 数据库” 菜单选项会卸载当前解决方案,删除 intellisense 数据库,然后重新打开解决方案,以确保数据库正确重建。

我们对在后台解析解决方案源代码的过程进行了一些更改。

泛型名现在以 Name`n 格式存储在 intellisense 数据库中,例如 IList`1 表示 IList<T>

运行时

新特性

添加了丢失的 ErrorExec() 函数(#830)

已添加对 BlobDirectExport、BlobDirectImport、BlobDirectPut 和 BlobDirectGet 的支持 (#832)

修正了创建带有自定义文件扩展名的 DBF 文件时出现的问题。还增加了对 _SET_MEMOEXT 的支持 (#834)

当您对两个不同类型的 USUAL 进行数字运算时,我们将确保不再丢失小数值(#808)。例如,LONG + DECIMAL 的结果将是 DECIMAL。 有关使用混合类型时可能的返回值,请参见本帮助文件中 USUAL 类型页面的表格

 

 

Bug 修复

修正了 _PrivateCount() 引发 InvalidateOperationException 的问题 (#801)

修正了编辑器中成员补全有时会显示错误类型方法的问题 (#740)

修正了 ACopy() 函数的一些问题 (#815)

修复了 VOSTRUCTs 中与日期有关的几个遗留问题 (#773)

宏编译器

新特性

添加了对 & 运算符的支持 (#835)

为后期绑定的方法调用添加了对引用参数的支持(同时支持 @ 和 REF) (#818)

VOXporter

Bug 修复

修正了在 PUBLIC 声明前添加“@@”不正确的问题

 

Changes in 2.9.0.2 (Cahors)

编译器

新特性

解析器现在支持多类型的类变量声明和全局声明(#709)

 EXPORT var1 AS STRING, var2, var3 as LONG

 GLOBAL globalvar1 AS STRING, globalvar2, globalvar3 as LONG

如果您正在使用我们的分析程序,您应该注意 ClassVarList 规则已经消失,ClassVars、VoGlobal 和 ClassVar 规则已经更改。

我们添加了一条命令,用于在 foxpro 数组中填充单个值

 STORE <value> TO ARRAY <arrayName>

 

创建包含 DATE 字段的 VOSTRUCT 或 UNION 时,编译器现在将使用新的 __WinDate 结构,该结构与 Visual Objects 中 VOSTRUCT 或 UNION 中的 DATE 值存储方式二进制兼容 (#773)

现在可以在 FoxPro 方言中使用括号(而不是方括号)访问 ARRAY 元素。必须启用编译器选项 /fox2 才能起作用 (#746)

我们增加了对在调用函数/方法代码中访问 WITH 块表达式的支持(仅适用于 FoxPro 方言)。因此,您可以在调用代码中键入 .SomeProperty 并访问属于 WITH BLOCK 表达式的属性。要使用此功能,必须启用 “后期绑定”,因为编译器不知道调用代码中表达式的类型(#811)。

 

Bug 修复

当您对父类中不存在(虚)方法的方法使用 NEW 或 OVERRIDE 修饰符时,现在会产生一个错误(#586#777)

修正了数组中 USUAL 变量的逻辑 AND 和 OR 问题 (#597)

某些编译器生成的代码(如后期绑定代码)的错误信息和警告并不总是指向正确的行号,而是指向方法或函数正文的第一行。这一问题已得到修复。(#603)

修正了 IIF 表达式返回值不正确的问题 (#606)

修正了编译器在 DECLARE METHOD 行中解析多个方法名时出现的问题 (#708)

修正了 FoxPro 方言中的一个问题,即向数组赋值以填充数组 (#720)

修复了当结构包含 DATE 类型成员时计算 VOSTRUCT 大小的问题 (#734)

之前的问题会导致运行时错误 (#735)

修正了代码中的一个问题 (#736)
var aLen := ALen(Aarray)

针对带有类型返回值的方法,修复了用 STRICT 覆盖 CLIPPER 方法时编译器崩溃的问题 (#761)

当接口实现的大小写与定义的大小写不同时,会显示错误信息 (#765)

修复了代码块内函数参数不正确时编译器崩溃的问题 (#759)

DEFINE 的递归定义可能导致编译器内部出现无限循环,从而引发 StackOverflowException(#755)

修正后期绑定调用和 OUT 参数的问题 (#771)

如果使用 4 级或更低的警告级别进行编译,则不会显示某些将值类型与空值进行比较的警告。现在我们已将默认警告级别改为 5。(#772)

修正了同一实体中多个 PRIVATE &cVarName 语句导致编译器崩溃的问题 (#780)

修正了通过引用传递 USUAL 参数时可能损坏 USUAL NIL 值的问题 (#784)

修正了在 FoxPro 方言中将已声明的 PUBLIC 变量创建为 PRIVATE 的问题 (#753)

修复了使用类型定义作为默认参数时出现的问题 (#718)

修正了类型化 DEFINE 可能产生错误类型常量的问题 (#705)

修正了从 #warning 和 #error 指令文本中移除空白的问题 (#798)

运行时

新特性

我们为 Empty() 函数添加了几个强类型重载,这些重载应该会提高性能 (#669)

我们在 RuntimeState 类中添加了一个事件处理程序。该事件处理程序名为 “StateChanged”(状态改变),预计将使用一个签名如下的方法:
Method MyStateChangedEventHandler(e AS StateChangedEventArgs) AS VOID
StateChangeEventArgs 类型具有设置枚举、OldValue 和 NewValue 的属性。
如果您需要在 X# 运行时和外部应用程序(如 Vulcan 应用程序、VO 应用程序或外部数据库服务器,如 Advantage)之间同步状态,则可以使用此功能。

我们添加了一个新的(内部)类型 __WinDate,用于在 VoStruct 或 Union 中存储日期值。该字段与 VO 存储在结构体和联合体内的 Julian 日期二进制兼容。

我们在 RuntimeState 中添加了一个条目,编译器会在其中存储主程序当前的 /fox2 编译器设置。

已添加运行时支持,支持通过分配单个值来填充 FoxPro 数组。

 

Bug 修复

修正了 Descend() 函数中的一个问题(与 VO 不兼容)(#779) - 重要提示:如果在 dbf 索引表达式中使用 Descend(),则需要重键这些索引!

返回 PSZ 值的后期绑定代码没有正确地将该值存储在 USUAL 内(#603)

修正了缓存 IO 中可能导致低级文件 IO 问题的一个问题 (#724)

在未打开表的区域调用 VODbAlias() 函数时,现在会返回 String.Empty,而不是 NULL。(#733)

修正了 MExec() 函数的兼容性问题 (#737)

在代码块中无法正确识别 M-> 前缀 (#738)

显式 DATE -> DWORD 转换会返回不正确的 NULL_DATE 值。

修正了后期绑定调用和 OUT 参数的问题 (#771)

添加了一个新的 __WinDate 类型,用于在 VOSTRUCT 或 UNION 中存储 DATE 值。(#773)

修正了 FoxPro 数组的几个问题

为操作 __ArrayBase<T> 的函数删除了 T 上的 TypeConstraints

修正了 Directory() 包含按短名匹配而不按长名匹配的文件的问题 (#800)

RDDs

使用 DBFCDX 驱动程序创建新 DBF 时,不会再自动删除现有 CDX 文件 (#603)

修复了在 DBFCDX 中更新备注内容的问题 (#782)

修复了创建 DBFCDX 索引文件时出现的运行时异常,文件名较长 (#774)

修正了 DBSeek() 在使用 OrderDescend() 时甚至无法找到已删除记录的问题。

修复了 OrderCreate()  中 ADS RDD 中缺少调用 AdsClearCallbackFunction() 的问题 (#794)

修正了 VODBOrdCreate 函数在 cOrder 参数包含空字符串时失效的问题 (#809)

宏编译器

修正了预处理器中的一个问题

添加了对使用 @ 操作符通过引用传递参数的支持

在宏编译器中添加了对 M->、_MEMVAR-> 和 MEMVAR-> 前缀的支持

当宏编译器发现 2 个或更多同名函数时,它现在会使用与编译器相同的优先级规则:

o首先使用用户代码中的函数

o"特定" 运行时(XSharp.VO、XSharp.XPP、XSharp.VFP、XSharp.Data)中的函数优先于 XSharp.RT 和 XSharp.Core 中的函数。

oXSharp.RT 中的函数优先于 XSharp.Core 中的函数

Visual Studio 集成

在本次生成中,我们开始使用 GitHub 上的 “Community toolkit for Visual Studio extensions”。该工具包包含针对 VS 扩展编写者代码的 “最佳实践”,就像我们一样。因此,现在有更多代码以异步方式运行,这将带来更好的性能。

我们还开始删除 32 位特定代码,这些代码在迁移到 VS 2022(Visual Studio 的 64 位版本,预计将于 2021 年 11 月发布)时会成为问题。

新特性

为编辑器添加了多项新功能

o编辑器现在可以显示实体之间的分隔线。您可以在选项对话框中启用/禁用该功能(#280)

oQuickInfo 工具提示中的关键词现在已着色 (#748)

o转到定义 “现在也适用于 ”外部 "类型。编辑器会生成一个临时文件,其中包含外部类型的类型信息。在选项对话框中,您还可以控制生成的代码是否包含注释(从外部 DLL 附带的 XML 文件中读取)。(#763)

o您可以通过 “工具/选项 ”菜单项(PUBLIC、EXPORT 或 NONE)控制 PUBLIC 可见性所使用的关键字。

o您可以通过 “工具/选项 ”菜单项(PRIVATE 或 HIDDEN)控制用于 PRIVATE 可见性的关键字。

现在,VS 内的各种代码生成器都遵循源代码编辑器的大写规则。

现在, intellisense 数据库的视图可返回源代码和外部程序集中的唯一命名空间

工具菜单中的 X# 特定菜单项已移至单独的子菜单中。

为 WinForms 设计器添加了选项,以便在保存时生成 form.prg 和 form.designer.prg 文件的备份(.bak)文件 (#799)

Bug 修复

修复了编辑器中的几个问题:

o我们对编辑器进行了多项改进以提高速度(#689#701)        

o修正了 FOREACH 循环中变量类型查找的一个问题 (#697)

o未显示从完成列表中选择的方法的参数提示(#706)

o当关键字后面没有空格时,关键字大小写同步不起作用 (#722)

o转到定义总是转到定义函数的文件的第 1 行/第 1 列 (#726)

o类中常量成员的代码自动完成 (#727)

o用于 DEFINES 的 QuickInfo(#730#739)

o使用操作符“. ”完成 VOSTRUCT 成员 (#731)

o在这些情况下,ENUM 和 FUNC 关键字现在被识别为标识符,而不是大小写同步(#732)。

o修复了打开文件时的一个问题 (#742)

o修复了默认值 NULL、NULL_DATE 和 NULL_OBJECT 的参数提示显示 (#743)

o修复构造函数的参数提示错误 (#744)

o嵌套类并非总能被 intellisense 正确处理(#745)

o修正了使用 ARRAY OF <something> 声明的变量的类型查找问题 (#749)

o当缓冲区包含无效代码时,编辑器有时会 “冻结”(#751)

o不存在的命名空间会产生错误的完成列表(#760)

o修正了在某些情况下输入无效代码时出现的编辑器异常 (#791)

Windows 窗体的代码生成器将制表符替换为空格。这一问题已得到修复。(#438)

修复了表单设计器损坏包含 EXPORT ARRAY OF <type> 的代码的问题

修复了表单设计器中的一个问题,即在编辑器中删除事件处理程序时,某些代码会被删除 (#812)

修正了表单设计器将 EXPORT、INSTANCE 和 HIDDEN 关键字转换为 PUBLIC 和 PRIVATE 的问题 (#802)

VO-兼容编辑器

现在,所有兼容 VO 的编辑器都支持完整的撤消/重做功能。还为菜单编辑器添加了剪切/复制/粘贴功能

修复了设计和测试模式下 VOWED 控件的若干视觉问题 (#741)

修复了在 “属性 ”窗口有焦点时,Alt-Tab 键跳出编辑器时 VS 崩溃的问题 (#764)

调整了 ComboBoxEx 控件,使其具有与 VO 中相同的固定高度。还允许以前的行为,即当用户手动将高度增加 50 像素以上时,将使用此高度(#750)

为 “属性 ”窗口中菜单编辑器的 “Button Bmp” 属性添加位图缩略图

已添加对在菜单编辑器中指定色带的支持。要使用的色带(位图)需要在菜单主项的属性中指定为文件名 (#714)

修正了窗口编辑器中事件代码生成的一些问题(#441#46)

 

Changes in 2.8.3.15 (Cahors)

编译器

新特性

现在,您可以在变量名或数字之间使用 .AND. 逻辑运算符和 .OR. 逻辑运算符,而无需前导或尾部空白 (a.AND.b)

FoxPro 方言中的 PRIVATE 声明不再允许初始化器。

在 FoxPro 方言中添加了对 FoxPro NULL 日期({ / / }、{ - - } 和 { .. }))的支持

Bug 修复

修正了在 DIM 数组中使用 DEFINE 作为维数的问题 (#638)

修正了 FoxPro PUBLIC ARRAY 命令的一个问题(ARRAY 关键字不再是强制性的)(#662)。

修正了以 DEFAULT(Usual) 表达式作为函数/方法调用参数的问题 (#664)

修正了用 LOCAL 声明声明变量并用 DIMENSION 命令标注尺寸的问题 (#683)

修正了不同 X# 运行时程序集中同名重载的问题,该问题会导致 FRead() 出现问题(#686)

修正了通过引用传递 PRIVATE 和 PUBLIC 内存变量的问题 (#691)

修正了 PARAMETERS 语句的一个问题 (#691)

修正了因 .AND. 和 .OR. 处理方式的更改而导致的实数问题 (#704)。

修复了类声明中 DECLARE METHOD / ACCESS / ASSIGN 行的解析问题。

修正了混合整数类型(如 int 和 word)的二进制运算符(+、-、*、/)的截断结果问题

运行时

Bug 修复

运行时状态中的 _shutdown 标志现在会在系统关闭时设置。

修正了 FoxPro ALen() 函数的一个问题 (#650)

在多个位置添加了默认值(#678)

修正了由 RDD 打开的文件上的 FRead() 会进入无尽循环的问题 (#688)

修正了文件处于 EOF 状态时 FieldGet() 的一个问题 (#698)

修正了当范围为空且另一工作区或另一工作站添加了与范围匹配的记录时的范围问题 (#699)

修正了 Skip(0) 之后的 BOF 设置问题 (#700)

宏编译器

新特性

现在,您可以在变量名或数字之间使用 .AND. 运算符,而无需前导或尾部空白

在 FoxPro 方言中添加了对 FoxPro NULL 日期({ / / }、{ - - } 和 { . . })的支持

宏编译器不再重新格式化包含 .AND. 和 .OR. 的字符串 (#694)

我们新增了一个试验性的更快脚本编译器。该脚本编译器只允许编译语句,而不允许编译函数、类等。
这种新的脚本编译器比现有的脚本编译器快得多,使用的内存也少得多。
要调用此脚本编译器,请使用新函数 ExecScriptFast(),其参数与 ExecScript() 相同。
您可以编译多行脚本。编译器应能识别所有接收参数的语句,包括 PARAMETERS 和 LPARAMETERS。
如果您在代码中使用脚本,我们很乐意听取您的反馈意见。
示例代码应能正常工作:

 
FUNCTION Start() AS VOID
LOCAL ctest AS STRING
TRY
   cTest := "? 'Hello world'"
   ExecScriptFast(cTest)
   cTest :=String.Join(e"\n",<STRING>{;
       "PARAMETERS a,b,c",;
       "RETURN CallMe(a,b,c)"})
   ? ExecScriptFast(cTest,1,2,3)
   cTest :=String.Join(e"\n",<STRING>{;
       "LPARAMETERS a,b,c",;
       "RETURN CallMe(a,b,c)"})
   ? ExecScriptFast(cTest,1,2,3)
 
CATCH e AS Exception
   ? e:ToString()
  END TRY
 
wait
RETURN
 
 
FUNCTION CallMe(a,b,c) AS USUAL
   ? "在函数内部,接收参数",a,b,c
  RETURN a+b+c

 
请测试这一新功能,并告诉我们您的想法。

Visual Studio 集成

新特性

当光标位于实体之外时(例如文件开头的 USING 语句),“高亮显示单词 ”现在可以高亮显示整个文件中的单词。

Bug 修复

修正了在兼容 VO 的 Windows 编辑器工具箱中显示自定义控件名称的问题

修正了从与 VO 兼容的 Windows 编辑器的 cavowed.inf 中加载设置时出现额外空格的问题

修正了赋值语句后的完成列表不正确的问题 (#658)

修正了编辑器中删除代码后出现的异常 (#674)

修正了将文件附加到外壳窗口时 VS IDE 中的 “冻结 ”问题 (#676)

修正了在使用 AllowDot 的 VO Dialect 中用圆点代替冒号时出现的问题 (#679)

修正了在类内显示完成列表的问题 (#685)

修复了编辑器中的一个性能问题 (#689)

修正了在编辑器中显示函数重载的问题 (#692)

修正了 intellisense  在 !、.NOT.或其他运算符之后出现的问题 (#693)

修正了完成列表中显示不正确方法的问题 (#695)

工具

修正了 VOXPorter 中有关资源和复制到资源子文件夹的问题

 

Changes in 2.8.2.13 (Cahors)

编译器

修正了扩展方法未标记为 STATIC 的问题 (#660)

修正了 IIF() 表达式在返回 OBJECT 时被赋值为十进制的问题。

pragma 命令没有检查当前方言

修正了预处理器中的一个异常

FoxPro LOCAL ARRAY 生成的不是 LOCAL 变量,而是 PRIVATE 变量。

XSharp.RT 中的函数如果在 XSharp.VO、XSharp.VFP 或 XSharp.RT 中被覆盖,将不再产生警告。不在 XSharp.RT 中的版本将优先使用

在 FOREACH 循环中枚举 USUAL 变量时,现在会调用一个运行时函数,该函数会返回 USUAL 中的 ARRAY,否则会出错。

启用 /vo7 时,现在支持从 OBJECT -> NUMERIC 的隐式转换。

运行时

现在,在 FOREACH 循环中枚举 USUAL 变量将调用一个运行时函数,该函数将返回 USUAL 中的 ARRAY,否则将抛出错误 (#246)

修正了一个问题,即创建索引时有一个 “val ”块和 0 条记录 (#619)

与 FoxPro 相比,修正了与 ALen() 函数和数组处理不兼容的问题 (#642)

我们更正了 FoxPro AIns() 函数中的一些问题 (#650)

我们添加了 ShowFoxArray() 函数,当您在 FoxPro 数组上调用 ShowArray() 时,将自动调用该函数(#650)。

已添加对 OClone() 的支持

_Quit() 函数现在会关闭所有数据库,然后杀死当前正在运行的进程 (#665)

修正了 DbOrderInfo 的一个问题 (#666)

修正了货币值的一元减运算符问题 (#670)

修正了整数函数在接收到货币值时出现的问题(#671)

我们新增了 MemCheckPtr() 的实现 (#677)

宏编译器

修正了在使用 Assembly.Load() 加载新程序集后调用函数的问题

已添加对通过引用传递变量的支持(尚未支持使用 Clipper 调用约定的函数)(#653)

VO SDK

修正了 GUI 类中 GetObjectByHandle() 的一个问题(#677)

Visual Studio 集成

修复了 VS 内部 “生成” 页面上的一个异常 (#654)

项目系统没有为 XML 文档生成写回正确的属性 (#654)

头文件中的 intellisense 可能会崩溃(#657)

我们在编辑器的成员组合框中添加了 #defines 和用户定义的命令(#command、#translate),作为全局类型的成员。现在,您还可以对使用 #define 定义的值执行转到定义。

我们更正了枚举的成员完成问题 (#656)

我们修复了 Windows 窗体编辑器中的一个问题,如果另一个 VS 扩展加载了旧版本的 Mono.Cecil (#661)

启用项目选项 “允许点 ”时,代码自动完成不会显示实例成员(#679)

"header" 新项目模板的扩展名是 .VH。现已改为 .XH

修复因 CAVOWED.INF 不正确而导致 VO 兼容窗口编辑器崩溃的问题

方法或函数调用括号内的代码自动完成功能无法正常工作

当没有更改文件时,提高了 Visual Studio 中的生成速度(#675)

工具

VO Xporter 在输出文件夹的 .xsproj 文件中生成了 2 行 (#672)

 

 

Changes in 2.8.1.12 (Cahors)

编译器

修正了插值字符串的问题(#598#622):

o脚本编译器现在能正确设置运行时中当前活动方言的 AllowDot 编译器选项(Core 和 FoxPro:AllowDot = true)

o当使用 DOT(.) 作为实例方法分隔符进行编译时,插值字符串内部会使用“: ”字符作为格式字符串的前缀。

o使用 COLON (:) 作为实例方法分隔符进行编译时,冒号不能用于分隔表达式和插值字符串内的格式字符串。在这种情况下,我们现在支持在表达式和格式字符串之间使用双冒号(::)。例如

LOCAL num as LONG
num := 42
? i"num = {num::F2}" // 该数字为两位小数
WAIT

现在可以在 VOSTRUCT 和 UNION 中使用 DATE 字段 (#595)

修正了 “UnconvertedConditionalOperator ” assertion 错误 (#616)

当使用命名空间 “xsharp ”时,修正了编译器中的 assertion 错误 (#618)

修正了 COM 程序集中定义的方法的 “failed to emit” 问题,这些方法带有默认参数和通过引用传递的参数 (#626)

修正了一个处理默认参数和方法调用的问题 (#629)

修正了 _SizeOf() 运算符无法计算 VOSTRUCT 正确大小的问题(#635)。
请注意,_SizeOf() 只能在应用程序编译为 x86 或 x64 模式时在编译时计算。为 AnyCpu 编译时,我们将在运行时计算 _SizeOf()。

修正了一个问题,即对于 USUAL 类型的变量,“IS Pattern” 并非总能正常工作 (#636)

运行时

实现了 FoxPro Evl() 函数(#389)

即使没有打开区域,DbCloseArea() 也会返回 TRUE。这与 VO 不兼容。现在我们将返回 FALSE。(#611)

宏编译器无法在动态加载的程序集中找到函数 (#607)

当 DBF 文件以 “只读 ”方式打开并创建索引时,由于 RDD 试图在 DBF 标头中设置 “production index ”标志,因此在关闭文件时会出现运行时错误。对于以 “只读 ”方式打开的文件,不再设置该标记 (#610)

修正了 DbOrderInfo(DBOI_KEYCOUND) 中的一个异常(已捕获) (#613)

修正了工作区调试窗口的一个问题 (#625)

当索引不可用时,DbOrderInfo() 返回不正确的值 (#627)

修正了 TransForm() 和符号参数的一个问题 (#628)

修正了 StrZero 函数的一个问题 (#637)

修复了 AELement() 函数的一个问题 (#639)

RDD 系统

当索引表达式包含 “nullable ”字段时,修正了使用 SqlExec() 函数创建的工作区/游标上的索引问题 (#630)

宏编译器

宏编译器在查找稍后加载的程序集内的函数时遇到问题(#607)

Visual Studio 集成

修复从常规页面保存方言的问题

快速信息和转到定义对同一类内的成员不起作用,如果这些成员的前缀不是 SELF:

修复使用“? ”语法的允许 null 值的类型的代码完成问题 (#567)

方法组合框未正确同步(#602)

Todo 注释并不总是能被正确解析,当它们是另一个词的一部分或不是该行的第一个词时,它们也会被包含在内。这一问题已得到解决。(#617)

修复 “警告作为错误 ”无法从 “生成” 页面保存的问题 (#621)

修复编辑器窗口分割后开始出现的问题(#641)

从完成列表中选择 “分配 ”类型的成员后,编辑器错误地插入了一个“(”字符(#643)

在实体(函数、方法)的声明行键入“(”会触发参数补全。这一问题已得到修复。(#643)

构造函数调用时未显示参数提示(#645)

完成列表错误地包括静态成员 (#646)

外部类型的 QuickInfo 不包括参数的 “AS Type”(#647)

修正了为尚未完全加载的项目解析器选项时出现的问题(#649)

在编辑器中,局部变量并非总能以正确的类型被识别(#651)

安装

安装程序将错误版本的 XSharp.CodeAnalysis.dll 添加到了全局程序集缓存中。这一问题已得到修复。

 

Changes in 2.8.0.0 (Cahors)

编译器

常规

我们已迁移到最新版本的 Roslyn 源代码。

通过引用将类型化变量传递给具有 clipper 调用约定(未类型化参数)的函数/方法时,无法更新局部变量。这一问题已得到修复。

/vo7 编译器选项未启用时,在 VO 方言的程序中使用 @ 操作符可能会生成产生 “无法装箱 ”错误的代码。(#551)

已优化 NULL_PSZ 和 NULL_SYMBOL 的生成代码 (#398)

当使用 PSZ 类型的元素时,结构和 UNIONS 上生成的 VoStructAttribute 大小错误。这一问题已得到修复。

修正了将 NULL 转换为 LOGIC 时的内部编译器错误

_SIZEOF() 操作符现在将为 VOSTRUCTS 和 UNIONS 生成一个常量。(#545)

使用关键字作为字段名可能会导致问题。例如,FIELD->NEXT 就处理不当。现在编译器允许这样做了。当然,您也可以使用 @@ 前缀来告诉编译器,在特定情况下,您指的不是关键字,而是一个标识符。

包含表达式列表的括号表达式无法正确编译。这一问题已得到修复。
如果您想在一个 IIF() 表达式中包含多个表达式,就会出现这种情况。
 
  LOCAL l AS LOGIC
  LOCAL v AS STRING
  l := TRUE                
  v := "abcd"
  ? iif (l, (v := Upper(v), Left(v,3)), (v := Lower(v), Left(v,4)))              
由于 Roslyn(C# 编译器)不允许在条件表达式中使用表达式列表,因此我们现在将括号表达式转换为对局部函数的函数调用。括号表达式中的表达式将成为新局部函数的主体,编译器将调用生成的局部函数。

现在,如果在有同名成员的类中调用 Function,编译器会发出警告。例如

 

CLASS Test
METHOD Left(sValue as STRING, nLen as DWORD) AS STRING
  RETURN "Test"
METHOD ToString() AS STRING
  RETURN Left("abc",2)   // 这会产生警告,说明调用的是函数 Left() 而不是方法 Left()。
                        // 如果要调用该方法,则必须在调用前加上 SELF:
END CLASS

新的语言特性

我们增加了对 LOCAL FUNCTIONLOCAL PROCEDURE 语句的支持。
这些函数和过程会成为另一个函数、过程、方法等的语句列表的一部分。它们有以下限制:

oLOCAL FUNCTION 必须以 END FUNCTION 结束,LOCAL PROCEDURE 必须以  END PROCEDURE 结束。

o支持普通函数的全部 “签名”,包括参数、返回类型、类型参数和类型参数约束。

o它们不能有属性(它们不是编译到方法中,而是编译到一种特殊的 Lambda 表达式中)

olocal function 的唯一有效修饰符是 UNSAFE 和 ASYNC

o由于它们不能具有属性,我们也不支持无类型参数,因此所有参数都必须是类型参数

o如果需要一个参数数量可变的 local function,可以定义默认参数值或使用 PARAMS 数组

oLocal functions 可以访问周围代码中的局部变量。Roslyn 创建了一个特殊结构,用于存储 Local functions 与其周围代码共享的变量

 

已添加对表达式体成员的支持。通过表达式体定义,您可以以非常简洁、易读的形式提供成员的实现。只要任何受支持成员(如方法或属性)的逻辑由单个表达式组成,您就可以使用表达式体定义。表达式体定义的一般语法如下:
MEMBER => expression
一个表达式体方法由一个单一表达式组成,该表达式返回一个值,其类型与方法的返回类型匹配,或者对于返回 void 的方法,执行某些操作。例如,重写 ToString 方法的类型通常包括一个单一表达式,该表达式返回当前对象的字符串表示形式。
例如

CLASS MyClass
METHOD ToString() AS STRING => "My Class"
END CLASS
 
这段代码的结果与以下代码完全相同
 
CLASS MyClass
METHOD ToString() AS STRING
  RETURN "My Class"
END CLASS
 

因此,可以说 => 操作符取代了 RETURN 关键字。

 

我们添加了对 C# 的 NULL 合并操作符 (??) 以及 NULL 合并赋值操作符 (??=) 的支持。
该操作符对 != null 进行检查。该运算符只适用于引用类型,不适用于 USUAL、DATE 等值类型和 INT 等内置类型。

FUNCTION Start() AS VOID
LOCAL s := NULL AS STRING
s := s ?? "abc"           // ?? 是 NULL 合并操作符
s ??= "abc"               // 这与之前的结果相同,但更紧凑
? s
RETURN
// 因此,这将无法编译
LOCAL i := 0 AS LONG
i := i ?? 42     // 操作符“?? ”不能应用于 “int ”和 “int ”类型的操作数
// 但这可以编译
LOCAL i := NULL AS LONG?   // Nullable LONG
i := i ?? 42      

我们为带有 INIT 访问器的属性添加了支持。通过这些访问器,您可以为属性赋值,但只能在构造函数中进行。该属性只能在类/结构的构造函数之外读取。

我们添加了一个新的编译器选项 /enforceself。使用该选项后,类内对实例方法的所有调用都必须以 SELF(或 SUPER)作为前缀。在 FoxPro 方言中,也支持此选项。请注意,某些生成的代码(如 Windows 窗体编辑器中的代码)并不使用 SELF:,应用此编译器选项可能会迫使您更改生成的代码,或者可能会迫使您在代码中添加 #pragma options(“enforceself”, disable) 以禁用该文件的选项。

我们添加了一个新的编译器选项 /allowdot 。通过该选项,您可以控制是否允许使用 DOT(“.”)运算符访问实例成员。Core 和 FoxPro 方言的默认值是 /allowdot+。其他方言的默认值为 /allowdot-。也可以通过 #pragma 来使用: #pragma options(“allowdot”, enable)

源代码中的 XML 注释不再需要完全限定的 cref 名称(#467)

预处理器

预处理器现在会自动声明一个名称为 <udc> 的匹配标记。该匹配标记将包含预处理器与 UDC 匹配的所有标记。例如,它可以用来将原始源代码作为字符串添加到结果中:
#command INSERT INTO <*dbfAndFields*> FROM MEMVAR => __FoxSqlInsertMemVar(<"udc">)

通配符标记(如上一条中的 dbfAndFields 标记)现在也可以出现在 UDC 中间。它们将继续匹配,直到找到通配符标记(上例中为 FROM 关键字)后的第一个标记。

标准头文件(来自 XSharp\Include 文件夹)现在也作为资源包含在编译器中。当文件丢失时,这些文件将从资源中加载。

预处理器没有为 __FOX2__ 生成宏。这一问题已得到解决(但现已过时,请参见 FoxPro 方言)

当通配符标记与 stringify 结果标记一起包含时,这些标记之间的空白会正确地包含在 UDC 的输出中。

FoxPro 方言

上一个版本中添加的允许将括号作为 FoxPro 方言数组分隔符的功能有太多副作用。我们暂时删除了这一功能。您必须再次使用带方括号的数组参数。

不再需要 /fox2 编译器选项(编译器会忽略该选项)。
编译器现在会检查运行时函数是否被标记为 NeedsAccessToLocalsAttribute,(XSharp.Internal 名称空间中定义的 NeedsAccessToLocalsAttribute)。
如果编译器发现一个函数标有此属性,如 Type() 函数或 SQLExec() 函数,那么它将在函数调用前后添加一些代码,以允许这些函数访问堆栈上的局部(变量)。只有启用了 /memvar 编译器选项,并且仅在 FoxPro 方言中才会发生这种情况。
NeedsAccessToLocalsAttribute 有一个强制参数,用于指示函数是要写入局部(变量)还是只读取局部(变量)。
当函数需要写入局部(变量)时,编译器会在调用后生成额外的代码,以确保在需要时更新局部(变量)。

我们为 FoxPro 嵌入式 SQL 语句添加了一个标准头文件。该头文件应能解析嵌入式 SQL,但会输出尚未支持嵌入式 SQL 的警告。

我们添加了对 FoxPro 数组的支持,在运行时为数组类型添加了一个特殊的子类型,并支持 DIMENSION 和 (Re)DIMENSION 以及通过分配单个值来填充数组。(#523)

运行时

常规

修正了 FSeek() 和 FSeek3() 返回值的一个问题

AsHexString() 和 AsString() 对 PTR 值的显示结果与 Visual Objects 不一致。

修复了 DBFCDX RDD 的 SetScope() 在前一个作用域为空时的问题 (#578)

调整了 Secs() 函数,使其更兼容 Visual Objects。

Array 和 Array Of 的枚举器现在会返回内部数据克隆的枚举器,以防止在代码中修改数组时出现运行时错误。

现在,各种 Xbase 类型(DATE、FLOAT、CURRENCY、BINARY、ARRAY、USUAL 等)都标有 [Serializable] 属性并实现了 ISerializable。它们都能与 BinaryFormatter() 类正常工作,因为该类不仅能存储值,还能存储 stream 中的值。大多数类型还能与 JsonSerializer 一起使用,但并非所有值都能通过 Json 序列化器正确反序列化。(#529)

Date 类型上的 CompareTo() 操作符不能正确排序数值,因为它对结构中元素的内存布局做出了错误的假设。这一问题已得到修复。

我们对 DbUseArea() 和 DbSkip() 等函数的错误处理进行了一些更改。在发生错误(例如文件无法打开)时,这些函数的处理方式并不总是与 Visual Objects 相同。现在,我们还添加了一个与 Visual Objects 中默认错误处理程序类似的错误处理程序,该处理程序的对话框包含 “放弃”、“重试 ”和 “忽略 ”按钮。只有当错误对象的属性 “CanRetry ”设置为 “TRUE ”时,重试按钮才会启用(#587, #594)

修正了 Val() 与小数位数超过一位的字符串不兼容的问题 (#572)

修正了 “反向” 比较日期的问题 (#543)

我们添加了几个函数,它们可以弹出对话框,显示当前打开的工作区、设置、全局变量以及私有和公共内存变量。请参见 DbgShowGlobals(), DbgShowWorkareas(), DbgShowMemvars() 和 DbgShowSettings()

RDD 系统

当工作区只读打开时,DbCommit 和 DbCommitAll 会失败。该问题已得到修复。(#554)

当 FoxPro CDX 文件有多个标志,而其中一个标志的索引表达式无效时(例如,Visual Objects 接受缺失的结尾括号),RDD 系统根本无法打开 CDX。现在我们打开 CDX,但索引表达式已损坏的标记除外。(#542)

已添加对 Advantage GUID 和 Int64 列的支持。GUID 以字符串形式返回,INT64 以 INT64 形式返回。我们还添加了 ACE 头文件中一些缺失的 DEFINE 值。

修复了 DBFNTX 驱动程序中负锁定偏移不正确的问题。

我们修复了几个与索引 “信息”(KeyCount、KeyNo)等有关的 “奇特 ”问题,这些问题涉及带作用域、降序索引等的索引(#423#578#579#580#582#583#593#599)。

修正了从不同线程和不同工作站打开 MEMO 文件(Fpt 和 DBT)时出现的问题 (#577)

我们更正了一个锁定和损坏问题,当两个站频繁写入同一个 CDX 文件时,可能会出现该问题。(#575, #592)

提高锁定失败时的锁定速度。(#576)

SetOrder(0) 对 ADS 表不起作用 (#570)

更改了几个 ADS 方法原型,使其具有正确的 IN / OUT 修饰符 (#568)

宏编译器

修正了 FoxPro 方言中以 VariableName.PropertyName 形式为表达式赋值的问题

X# 宏编译器允许在宏中引用 GLOBAL 和 DEFINE 值。这使得编译器与 VO 不兼容,当索引与 GLOBAL 或 DEFINE 同名的字段时会出现问题。宏编译器已不再支持引用 GLOBAL 或 DEFINE。(#554)

宏编译器在变量名被括号包围时遇到了问题。编译器将其视为类型转换。现已修复。(#584)

Visual Objects SDK

为 Win32APILibrary 程序集添加了一些缺失的定义,如 DUPLICATE_SAME_ACCESS。

DbServer:Filter 有时会返回 NIL 而不是空字符串 (#558)

 

VO 方言

我们新增了对 SysObject 的支持 (#596)

Xbase++ 方言

修正了 2.7 中引入的 XPP Collation 表问题

FoxPro 方言

/fox2 编译器选项添加了 NeedsAccessToLocalsAttribute 属性

调整了向 Type() 和 SqlExec() 等函数公开 LOCAL 变量值的代码。

有几个函数已经标记了新属性,这样它们就能 “看到” 局部变量。

添加了带单个参数的 TransForm() 重载。

修正了 SQLExec() 函数和包含“:”(冒号)字符的 sql 语句的一个问题。

我们添加了 Bit..() 函数(感谢 Antonio)

我们添加了 CapsLock()、NumLock() 和 InsMde(感谢 Karl-Heinz)。

我们改进了 FoxPro 数组代码 (#523)

 

运行时脚本

此版本通过 ExecScript() 函数引入了运行时脚本功能。此时,如果使用运行时脚本,则必须包含完整宏编译器(XSharp.MacroCompiler.Full.dll)及其支持动态链接库(XSharp.Scripting.dll , XSharp.CodeAnalysis.dll ),

我们正在开发一个轻量级的运行时脚本版本,它将包含在下一个版本中。

更多信息参见 运行时脚本

Visual Studio 集成

此版本中的 Visual Studio 集成不再支持 Visual Studio 2015。仅支持 Visual Studio 2017 和 2019。

常规

在子文件夹中生成的新代码模板的命名空间名称以 “global:: ”开头。这一问题已得到修复。

已添加对 LOCAL FUNCTION 和 LOCAL PROCEDURE 的支持。

从文件夹中的类模板添加项目时,命名空间前缀为 “global::”。这一问题已得到修复。

当磁盘上的 intellisense 数据库文件损坏时,就会发生错误。现在该文件已被删除,所有代码信息都已重新收集。

工具/选项 “对话框中的 ”编辑器 “选项现在标记为 ”X#“,而不再是 ”XSharp"。

我们在 “工具/选项 ”下添加了一个窗口,您可以在这里为我们的 VO 兼容编辑器设置几个值,如 grid 大小、粘贴偏移等。请在工具选项对话框中查找 X#。

我们在编辑器的格式选项中添加了两个新选项:“修剪尾部空白 ”和 “插入最后换行符”。

加载 MsTest 项目并不总是有效。打开项目时将调整 MsTest 项目的项目文件。(#563)

我们新增了对 t4 模板(扩展名为 .tt 的文本文件,其中包含用于生成代码的脚本)的支持

添加现有 .resx 文件不会使其成为父 form.prg 的子节点 (#197)

项目属性对话框已完全重新设计。

 

源代码编辑器

较长的 “QuickInfo ”工具提示现在会多行显示,以便于阅读。

重构了 “类型查找 ”代码,以提高源代码编辑器的运行速度

对于使用 VAR 关键字声明的变量,如果存在嵌套的大括号和/或小括号,源代码编辑器中的成员补全并不总是有效。(#541, #560)

修正了项目引用的成员完成问题 (#540)

修正了在取消注释行块时出现的异常,如果行块中有一行是空行。

我们增加了对 .editorconfig 文件的支持。请参阅文档文件中有关 .editorconfig files 的章节。

折叠最后一个实体 om 后编辑器无法正常工作(#564)

修正了续行注释后语法高亮显示的问题(#556)

为委托添加了参数补全(#581)

修正了 QuickInfo 工具提示中某些西里尔字符的问题(#504)

 

代码生成器

字符字面现在总是以 “c ”为前缀,值 > 127 则以十六进制符号书写,以确保它们在所有代码页中都能正常工作。

Windows 窗体设计器

我们修复了 DevExpress 控件的几个问题。

修正了与 X# 关键字同名的控件的问题 (#566)

修正了具有 DWORD 类型属性的控件的一个问题 (#588)

修正了字符字面代码生成中的一个问题 (#550)

.designer.prg 不再需要有 “INHERIT FROM ”子句。(#533)

对象浏览器

当您首先执行搜索时,转到定义不起作用 (#565)

VO 兼容窗体设计器

在 WED 中添加了支持,可正确直观地显示未定义预期控件类继承的自定义控件

修正了 cavowed.inf 中无法识别非数据感知自定义控件的问题

已添加对克隆 Windows 的支持(#508)

修正了复选框的显示问题 (#573)

修正了代码生成中的一个问题 (#553)

在 “工具/选项 ”中有一个菜单选项,可设置多项设置(#279#440)

调试器

调试器现在完全支持 64 位调试

已添加对 CURRENCY 和 BINARY 新类型名称的支持

模板

我们对多个 VS 项目模板和项目模板进行了调整 (#589)

我们新增了 X# t4 模板(.tt 文件)

 

Changes in 2.7.0.0 (Cahors)

编译器

常规

修正了 Nullable 类型的一个问题,这些类型在赋值时缺少显式转换

修正了在类层次结构中调用父类构造器时跳过父类层次而调用祖类构造器的问题。

/usenativeversion 命令行选项未检查 +/- 开关。现已修复。

修正了在文件名中包含嵌入式 DOT 的源文件(my.file.prg)中 PCall() 和 PCallNative() 的一个问题

我们在 XSharp\Include 文件中添加了一个新的头文件,它可以帮助添加自定义用户定义命令或定义,你可以将其包含在每个项目中。我们的 XSharpDefs.xh 将自动包含该文件(CustomDefs.xh)。
该文件的默认内容只是一些注释。
安装程序不会覆盖该文件夹中的文件,卸载产品时也不会删除该文件。
您可以选择在项目文件下的包含文件夹中自定义该文件。不过,您也可以将同名文件添加到项目文件夹或项目/解决方案的通用包含文件夹中。最后一个位置可以让您将头文件与其他源代码一起置于源代码控制之下。

FoxPro 方言

编译器现在允许在 LOCAL、PRIVATE 和 PUBLIC 声明中使用 M Dot (M.) 前缀。(LOCAL m.Name)

在 Foxpro 对话框中,编译器现在也接受小括号作为数组分隔符 (aMyArray(1,2))

编译器现在允许(或忽略)PRIVATE、PUBLIC、PARAMETERS 和 LPARAMETERS 声明中的 AS Type OF Classlib 子句。

支持 TRY CATCH 的 CATCH 子句中的 TO 关键字

已添加对 ASSERT 命令和 SET ASSERT 的支持

已添加对 SET CONSOLE 和 SET ALTERNATE 的支持

使用单个等号运算符对宏进行赋值时不起作用(&myVar = 42)。这一问题已得到修复。

已添加对零长度二进制字面量 (0h) 的支持

生成系统

添加了一个项目属性,用于控制本地资源编译器是否抑制 RC4005 错误(重复定义)。

运行时

常规

IsMethod() 现在对重载方法返回 TRUE。

AbsFloat() “丢失” 了小数位数的设置。现已修复。

Binary:ToString() 在二进制值小于 15 时使用了个位数。现已修复。

添加了隐式运算符,可将常量赋值给二进制。

添加了将包含整数的 USUAL 值隐式转换为 Intptr 的功能。

一些低级函数现在会在操作失败时设置操作系统错误编号 FERROR_EOF,就像在 VO 中一样。

后期绑定代码中的异常并不总是显示错误发生的正确位置。这一问题已得到修复。

我们增加了对 DataSessions 的支持。运行时中打开的工作区/cursor列表现在称为 “DataSession”(旧名称 “工作区 ”仍然可用)。
您可以拥有多个 datasessions。您还可以使用 RuntimeState 类上的一个新方法 SetDataSession 来切换 RuntimeState 中的 “活动” datasessions。
FoxPro 数据库在自己的 datasession 中打开。
通过添加观察表达式,可以在调试器中检查打开的 DataSessions: XSharp.RDD.DataSession.Sessions
每个 DataSession 都与一个线程相关联。当线程停止或中止时,DataSession 将被关闭,同时也会关闭其所有表。
程序关闭时,所有 DataSessions 都会关闭,包括它们的表。这是通过 AppDomain:ProcessExit 事件处理程序完成的。

在独占模式下打开文件的低级文件 IO 函数(包括 RDD 系统)现在使用 “缓冲 IO”。这将提高性能。

删除了 Stream 和 MemoryStream 相互转换的函数(未文档化)。取而代之的是上一条中的缓冲区 I/O。

我们为 FoxPro CursorProperties、DatabaseProperties 和 SQLProperties 添加了 System.Enum 类型。

我们添加了一个 DatabasePropertyCollection 类型。该类型用于向字段添加 “附加 ”属性,如 FoxPro 表的 DBF 字段。.

终端 API

我们新增了对备用文件的支持。SET ALTERNATE TO SomeFile.txt。还可设置 ALTERNATE ONSET ALTERNATE OFF

? 命令 现在尊重 Set Console 和 Set Alternate 的会话。

我们新增了对 SET COLOR 命令的支持。只使用设置中的第一个颜色,闪烁属性将被忽略并解释为 “高亮”。例如 SET COLOR TO w+/b

我们增加了一个 CLEAR SCREEN 命令

FoxPro 方言

添加了 Assert 对话框

已添加对 DBC 文件的支持。这包括 SET DATABASE to 命令、DbGetProp() 以及读取作为数据库一部分的文件的属性,而无需首先显式打开数据库。目前,DbSetProp() 还不能执行任何操作。此外,DbAlias() 等类似函数也已实现。

运行时现在可以使用 DataSession 对象。DBC 文件和每个线程中的文件一样,都在各自的 DataSession 中打开。每个 DataSession 都有一个已打开表的列表,以及别名和游标/工作区编号的唯一列表。

现在,SqlExec() 返回的游标中的 “自增”(AutoIncrement)列的编号方法是从 -1 开始,每增加一行就减去 1。

FoxPro 方言所需的若干设置已添加到 Set Enum.

宏编译器

到目前为止,宏编译器生成的运行时代码块都是接收对象数组并返回对象返回值。运行时中有一个类对此进行了封装,并负责参数的 usual->object 转换以及返回值的 object->usual 转换。当宏返回 NIL 值时就会出现问题,因为该值会被转换为 NULL_OBJECT。
之所以使用 OBJECT API,是因为宏编译器需要在 Core 方言(RDD 系统)中使用,而该方言不支持 USUAL 类型。
现在,我们在 XSharp.RT 程序集中添加了一个新的 IMacroCompilerUsual 接口,允许将字符串编译成支持 USUAL 参数和 USUAL 返回值的代码块。宏编译器现在同时支持该接口和 “旧 ”接口。因此,在编译宏时,您可能会看到(非常小的)性能改进。

不支持在宏内调用 Altd() 和 _GetInst()。现已修复。

当您在自己的代码中重载内置函数时,宏编译器会报错。现在,我们已在运行时中实施了默认的 MacroCompilerResolveAmbiguousMatch 委托,该委托会优先使用您代码中定义的函数,而不是我们代码中的函数。

在选择方法或函数的两个重载时,宏编译器现在会选择带 USUAL 参数的方法,而不是不带 USUAL 参数的方法。

修正了调用带有引用参数或 out 参数的函数/方法时出现的问题

在宏编译器中添加了对 CURRENCY 和 BINARY 类型的支持。

RDD 系统

独占 DBF 访问现在以 “缓冲” 模式运行,速度应该会快很多

在内部,RDD 现在与 Stream 对象一起工作,这样速度会更快一些。

修正了更新索引中存在大量重复键值的键时出现的问题。

删除了几个代码页中重复的 Foxpro “mahcine” collations,因为它们都是一样的。

对于字段名大于 10 个字符的 VFP 兼容 DBF 文件,现在可以使用短字段名(10 个字符)或全字段名来检索值。

DBFVFP 驱动程序现在使用运行时内置的 DBC 支持来读取 DBF 文件的 “扩展” 属性。这些属性包括更长的字段名和标题等。当 DBFVFP 表被用作 DbDataSource 或 DbDataTable 的数据源,并且该数据源被分配给 Grid 时,Grid 中的列标题应显示来自 DBC 的标题。

现在,与 VO 和 Vulcan 一样,带有空代码页字节的 DBF 文件将以 DOS - US 格式打开。

当 DBFCDX/DBFVFP 区域是 SetRelation 中的子区域,而之前的父区域值导致结果集为 “空 ”时,GoTop()、GoBottom() 和其他操作会失败。

我们在 RDD 程序集中添加了 ADS 管理 API 的结构和功能。

Visual Studio 集成

在 VS IDE 中创建新的 VO 兼容 UI 表单时,现在可以克隆现有表单。

修正了 VO 兼容表单编辑器中自定义控件的一些问题。

修正了 Windows 窗体编辑器中 DevExpress 控件代码分析和代码生成的几个问题

带有 “flavored” 项目(如 MsTest 项目)的解决方案并非总能正确打开。可能会出现异常。

我们在 workarea 类中添加了一个(internal)属性 FieldValues(),可以在调试器中查看当前记录的字段名及其值。要在调试器中查看当前工作区,必须添加观察表达式: XSharp.RuntimeState.DataSession.CurrentWorkarea

已添加项目属性,用于设置新标志以抑制资源编译器出现 RC4005(重复定义)错误。

 

Changes in 2.6.1.0 (Cahors)

这是一个错误修复版本,修复了 2.6.0.0 中发现的一些问题

编译器

修正了通过引用将类型化变量传递给后期绑定代码和未类型化构造函数的问题

修正了代码中包含逻辑的定义被转换为字节时的内部编译器错误
  BYTE(_CAST, LOGICDEFINE).
当然,这种代码在任何时候都应该避免,但遗憾的是,即使是 VO SDK 也充斥着这样的代码。
例如,上例应写成 IIF(LOGICDEFINE,1,0)。编译器会发现该定义是常量,并用 1 或 0 替换该代码。

编译器无法将 $.50 识别为有效的货币字面量(因为缺少 0)。现在可以接受了。

运行时

更新了运行时中处理后期绑定调用的代码,以改进对引用参数的处理

修复了访问 OleAutoObject 类中 fInit、dwFuncs 和 dwVars 等属性时,后期绑定代码中的一个问题

为 “Usual” 类型添加了操作符 TRUE 和操作符 FALSE

使用 NULL_STRING 调用 Val() 可能会导致异常。该问题已得到修复。

DbDataTable() 和 DbDataSource() 返回的字符串属性现在可使用字符串类的 TrimEnd() 方法进行修剪。

添加了 DbTableSave() 函数,用于将 DbDataTable 中的更改保存到当前工作区。

Visual Studio 集成

打开和升级 Scc 下的项目文件有时会导致问题。现已修复

修正了 2.6.0.0 中引入的导致任务列表不再更新的问题。

打开引用磁盘上不存在的 X# 项目的解决方案可能会导致异常。该问题已得到修复。

打开不属于解决方案的 X# 项目文件也可能导致异常。这一问题已得到解决。我们假定该项目是解决方案文件的一部分,该文件与项目位于同一文件夹中,且名称相同(但扩展名不同)。

项目系统不再为更新的项目制作备份文件。我们假定使用者都在自行备份或使用某种 SCC 系统。

修正了导致 VS 任务列表无法用于 X# 项目的回归问题。

 

Changes in 2.6.0.0 (Cahors)

请注意,此版本中有一些破坏性更改。

因此,运行时组件的 Assembly 版本号已更改,您需要重新编译所有代码,并需要第三方组件的新版本!

编译器

编译器忽略了 (USUAL) 大小写。现已修复。

当编译器检测到 TRY ...ENDTRY(不含 CATCH 和 FINALLY)时,它会自动添加一个 CATCH 类,以静默方式捕获所有异常。以前就有这种情况,但现在出现这种情况时,我们会生成警告 XS9101

在调用后期绑定的方法时,通过带 @ 符号的引用传递参数无法正常工作。这一问题已得到修复。

编译器选项 vo15 和编译器选项 vo16 现在也可以用 #pragma 进行设置了。

启用 /vo16(自动生成 Clipper 调用约定构造函数)后,编译器也会向标有 [COMImport] 属性的类添加构造函数。这一问题已得到修复。

货币字面量 ($12.34) 未编译为货币类型,而是存储为 System.Double。这一问题已得到解决。

修正了在版本号指定为 [assembly: AssemblyVersion (“1.0.*”)] 或 [assembly: AssemblyVersion (“1.0.0.*”)] 时自动生成版本号的问题。
如果使用 /deterministic 编译器选项进行编译,则会出现错误信息 XS8357

修正了向带有参数数组的构造函数传递单个 USUAL 参数时出现的问题。

修正了在类树中调用重载方法时出现的一个问题,在类树的某一层中,参数为一种类型,而在另一层中,方法名称相同,但参数为另一种类型,并且存在从一种类型到另一种类型的隐式类型转换(如 Date 和 Datetime 之间,或 String 和 Symbol 之间)。现在,编译器首先会查看是否存在类型完全相同的重载,如果没有,则会查找参数可以通过隐式转换传递的重载。

现在可以使用 __CastClass()伪函数将一个常量装箱一个对象,或将一个常量从一个对象中拆箱。
__CastClass(USUAL,<objectValue>) 拆箱对象内部的 USUAL
__CastClass(OBJECT, <usualValue>) 将装箱 usual 到一个对象

<usualValue> IS SomeType VAR <newVariableOfTypeSomeType> 子句在将 Usual 装箱为 Object 并将其分配给新变量之前,而不是从 usual 中提取对象。这个问题已经修复。

当赋值操作符为单个等号字符时,后期绑定赋值(如 obj.&prop = “Jack”)会失败。这一问题已得到修复。

当 SomeArea 未打开时,SomeArea->(SomeExpression()) 等别名表达式会在错误的源代码行上返回错误。该问题已得到修复。

我们添加了对二进制类型和二进制字面量的支持。请参阅文档中有关 binariesbinary 字面量 的主题。

像下面的表达式
       LOCAL dwDim := 512 IS DWORD
被解析为
       LOCAL dwDim := (512 IS DWORD) AS USUAL
因此,dwDim 包含一个具有逻辑值的 USUAL。
该问题已得到修复,现在这段代码会出现 DWORD 变量不能用 IS 关键字声明的错误。
GLOBAL 变量和 Class 变量也会出现这种情况。

我们添加了一个 MatchLike 预处理器标记,以匹配包含通配符的表达式,例如 UDC 中的表达式
SAVE ALL LIKE a*,*name TO SomeFileName.
用于 MatchLike 的标记是 <%name%>

在 TRY ... CATCH 语句中添加了对模式匹配(WHEN 子句)的支持,例如下面的示例。WHEN 关键字是位置性的,因此也可用作变量名,如示例中的变量名。

FUNCTION Test AS VOID
  local when := 42 as long
  TRY
    THROW Exception{"FooBar"}
  CATCH e as Exception WHEN e:Message == "Foo"
     ? "Foo", when, e:Message
  CATCH e as Exception WHEN e:Message == "Bar"
     ? "Bar", when, e:Message
  CATCH WHEN when == 42
     ? "No Foo and No Bar", when
     
  END TRY                
  RETURN

已添加对 SWITCH 语句的模式匹配和筛选器的支持。我们既支持 “标识符 AS 类型 ”子句,也支持 “WHEN 表达式 ”过滤子句,如下例所示

  VAR foo := 42
  VAR iValues := <LONG>{1,2,3,4,5}
  FOREACH VAR i IN iValues
    SWITCH i
    CASE 1                       // 这种模式现在被称为 "恒定模式"
        ? "One"
    CASE 2 WHEN foo == 42         // 恒定模式过滤器
        ? "Two and Foo == 42"
    CASE 2
        ? "Two"
    CASE 3
        ? "Three"
    CASE 4
        ? "Four"
    OTHERWISE
        ? "Other", i
    END SWITCH

VAR oValues := <OBJECT>{1,2.1,"abc", "def", TRUE, FALSE, 1.1m}
  FOREACH VAR o in oValues
    SWITCH o
    CASE i AS LONG         // 模式匹配
        ? "Long", i
    CASE r8 AS REAL8   // 模式匹配
        ? "Real8", r8
    CASE s AS STRING WHEN s == "abc" // 带有过滤器的模式匹配
        ? "String abc", s
    CASE s AS STRING     // 模式匹配
        ? "String other", s
    CASE l AS LOGIC   WHEN l == TRUE   // 带有过滤器的模式匹配
        ? "Logic", l
    OTHERWISE
        ? o:GetType():FullName, o
    END SWITCH
  NEXT

请注意,这些模式和过滤器的性能与普通的 IF 语句或 DO CASE 语句无异。
所不同的是,编译器会检查 CASE 表达式是否重复,这样就不容易出错。

我们增加了对 IN 参数修饰符的支持。它声明了一个 REF READONLY 参数。在向方法或函数传递大型结构时,可以考虑使用该参数。编译器不会传递整个结构,而只会传递结构的地址,即 4 字节或 8 字节,具体取决于运行的是 32 位还是 64 位。
我们计划在 X# 运行时将其用于接受 USUAL 参数的函数,这将为您带来微小的性能优势(在 32 位模式下,Usual 变量为 16 字节,在 64 位模式下运行时为 20 字节)。

运行时

延迟绑定代码中的错误信息并不总是显示导致异常的错误。我们现在检索 “最内部 ”异常,因此信息会显示抛出的第一个异常。

我们添加了 Set.Safety 和 Set.Compatible 的运行时状态设置,以及 SetCompatible 和 SetSafety 函数。

用于为各种 Db..()函数保存和恢复工作区的 UDC 不正确,导致在函数调用后选择了错误的区域。这一问题已得到修复。

添加了 VFP MkDir() 函数。

修正了当一个类型的子类只实现了 Getter 或 Setter 而父类同时实现了两者时,在后期绑定的 IVarGet() / IVarPut() 中出现的问题。

我们添加了 IDynamicProperties 接口,并在 XPP DataObject、VFP Empty 和 VO OleAutoObject 类中添加了该接口的实现。该接口用于优化对这些类中属性的后期绑定访问。

OleAutoObject.NoMethod 中的异常没有 “原样 ”转发,而是作为参数异常转发。

为了与 FoxPro 兼容,Select() 函数现在在 FoxPro 方言中的行为有所不同(当传递的别名不存在时不会出现异常)

当从一个异常创建一个 Error 对象时,最内层的异常将被用于获取错误信息。

Default() 函数的大小写已更改。

我们新增了 XSharp.__Binary 类型。更多信息,请参见上面的编译器主题。

我们在 dbcmd.xh 中添加了 CLOSE ALL UDC,作为 CLOSE DATABASES 的同义词。

RDD 系统

当字段名大于 10 个字符时,修正了 ADSADT 驱动程序的 Advantage RDD 中的一个问题。

在 Advantage RDD 中,作为关系中子表的表的 EOF、BOF 和 FOUND 标志设置不当。这一问题已得到修复。

在 FoxPro 方言中,“自动排序” 行为发生了变化。在该方言中,不再选择第一个索引中的第一个顺序。索引文件已打开,但文件保持自然顺序,打开文件时光标定位在记录编号 1 上。

导出 CSV 和 SDF 时,空日期会出现异常。现已修复。

当打开一个 CDX 时,如果其中一个顺序表达式无法编译(因为缺少一个函数),那么以前会忽略整个 CDX。而现在,其他标签会被成功打开。RuntimeState.LastRddError 属性将包含一个 Exception 对象,其中包含打开失败的标记的错误信息。

在 DBFVFP 驱动程序中,“I ”类型字段的索引键计算不正确。现已修复。

修正了 OrdDescend() 函数的一个问题

Visual Studio 集成

修正了参数列表中默认表达式的 VS 解析器问题

外部方法/函数的参数并不总是显示正确的 “As”/“Is ”修饰符

现在,QuickInfo 工具提示上的位置显示在工具提示内的独立一行上。

修正了一个问题,即 XML 文件中第一个成员的 XML 工具提示或参数提示未显示。

我们对项目文件格式进行了更改(见下文注释)。使用此 X# 版本打开时,所有项目文件都将更新。

提高了在 Visual Studio 内关闭解决方案的速度。

项目系统将不再尝试更新 SDK 样式的项目文件。

在查找 Foo.SomeMethod() 等方法时,代码模型有时会返回 Bar.SomeMethod() 方法。
这导致在 Windows 窗体编辑器中打开窗体时出现问题。这一问题已得到修复。

VO 兼容的编辑器

现在,从 VO 兼容编辑器生成的代码保留了类的 INTERNAL 或其他修饰符以及 IMPLEMENTS 子句。

我们更正了按钮控件中 “LoadResString ”标题的显示方式

Foxpro 命令

我们增加了对几个新的 Foxpro 兼容命令的支持:

CLOSE ALL

SCATTER

GATHER

COPY TO ARRAY

APPEND FROM ARRAY

COPY TO  SDF|CSV|DELIMITED|FOXPLUS|FOX2X

APPEND FROM SDF|CSV|DELIMITED|FOXPLUS|FOX2X

所有变体都支持 fields list、FIELDS LIKE 或 FIELDS EXCEPT 子句,相关命令还支持 MEMO 和 BLANK 子句.

并不支持 COPY TO 和 APPEND FROM 的所有变化,例如复制到 excel 和 sylk。

COPY TO 命令中的 Database 和 name 子句以及 CodePage 子句暂时被忽略

生成系统

我们已准备好 X# 生成系统,以便与 .Net 5 和 .Net Core 使用的 SDK 类型项目配合使用。请参阅下面的主题,了解这对项目文件意味着什么。

请注意,由于在 Visual Studio 之外运行的自动生成也需要生成系统,因此生成系统的源代码已移至 GitHub 上的编译器资源库。

项目文件的更改

现在,我们不再将 MSBuild 支持分别部署到每个 VS 版本内的文件夹中,而是将其一次性部署到 XSharp 安装文件夹内的文件夹中。
安装程序会设置一个指向该文件夹的环境变量XSharpMsBuildDir。因此,当使用该版本的 X# 打开时,所有项目文件都将得到更新。

我们所做的更改是将宏“$(MSBuildExtensionsPath)\XSharp ”替换为“$(XSharpMsBuildDir)”,后者是一个环境变量,指向机器上 X# MsBuild 支持文件的位置。如果在生成服务器上运行 X#,则可以在需要时在生成脚本中设置该环境变量。

安装程序会自动添加该环境变量,并将其指向 <XSharpDir>\MsBuild 文件夹。

 

Changes in 2.5.2.0 (Cahors)

编译器

如果定义中的表达式包含值大于 127 的 _Chr()函数,则会生成警告,提示开发机器和最终用户机器之间可能存在代码页差异。

修复了一个问题,其中一个宏定义被定义为 PTR(_CAST,0),并且这个宏定义也被用作函数/方法的默认值。

运行时

在 NULL_OBJECT 上调用 IsAccess、IsAssign 和类似方法会导致异常。这一问题已得到修复。

EmptyUsual 现在也适用于 OBJECT 类型

当浮点数除法返回无限值时,不会产生除以零的异常。这一问题已得到修复。

当在后期绑定调用中跳过一个参数,且该参数有一个默认值时,我们将使用默认值,而不是 NIL

StrTran() 第 5 个参数(uCount)的默认值 “仅” 替换 65000 次。现在,默认值将负责替换所有出现的次数。

传递给 NoIVarGet() 和 NoVarPut() 的变量名现在转换为大写字母。

RDD 系统

修正了当作用域降序 Cdx 位于 Eof() 时向前跳转的问题

VOSDK

有几个 DbServer 方法在选择正确的工作区之前调用一个方法来写入更改。这是一个源于 VO 的老漏洞,现已得到修复。

Visual Studio 集成

在 VS 2019 中查找 XML 文档有时不起作用。这一问题已得到修复。

现在,ClassView 和 Objectview 可以 “在一定程度上 ”工作。这一点需要改进。

改进了所谓 “主要互操作程序集 ”的加载

修复了编辑器窗口中 “类型 ”和 “成员 ”下拉栏中的一个问题

改进了在 VO 兼容窗口编辑器中应用复制/粘贴时控件重命名的功能。

打开 VO 窗口编辑器时,VO 窗口编辑器的 X# 工具栏现在会自动显示

VO 窗口编辑器(以及其他 VO 编辑器)的属性窗口和工具箱的位置和大小现在可以在 Visual Studio 会话之间保存。

生成系统

生成的 XML 文件是在项目文件夹中而不是在中间文件夹中生成的。这一问题已得到修复。

文档

大多数主题的 [Source] 链接丢失。现已修复。

更正了一些文档

 

Changes in 2.5.1.0 (Cahors)

编译器

此版本中的编译器没有变化(仍称为 2.5.0.0)

运行时

(VO 兼容性)修正了数组的 VO 兼容性问题。现在,使用 2 维索引访问单维数组将返回 NIL,且不会产生异常。这是一个愚蠢但兼容的问题。

(VO 兼容性)用符号比较一个带数值的常量不再产生异常。数值现在被转换为符号,并使用该符号进行比较。

(XPP 兼容)不允许使用索引操作符(u[1])访问包含 LONG 的 USUAL 变量。这将返回 TRUE 或 FALSE,是检查位是否被设置的一种简单方法。

"DB" 和 ”CR" 的字面现在存储在资源中,可根据其他语言进行更改。

为支持延迟绑定添加了一些优化代码

Visual Studio 集成

如果外部程序集包含两种类型,而这两种类型的名称只是大小写不同,则读取外部程序集的类型信息将失败。

实体解析器无法识别前缀为可见性修饰符(PROTECTED SET)的 GET 和 SET 访问器

实体解析器无法识别不以 MEMBER 关键字开头的 ENUM 成员

已添加对 Visual Studio 任务窗口的支持。包含 TODO 或 HACK(可在工具/选项窗口中配置)字样的源代码注释现在会添加到任务列表中。这些任务会保存在 intellisense 数据库中,因此在打开解决方案后,所有任务都会立即显示,而无需(重新)扫描源文件。

修正了 WIndows 窗体编辑器的类型和成员查找中的一个问题

修正了 VS 调试器中的一个问题,即在数组和集合的索引操作符中减去 1。这显然是不正确的。

生成系统

生成的 XML 文件的文件名来自项目文件名而非输出程序集名。这一问题已得到修复。

 

 

Changes in 2.5.0.0 (Cahors)

编译器

如果 #pragma 行后面跟着不正确的语法,就会 “吃掉 ”不正确的语法,导致整个方法被排除在编译之外。这一问题已得到修复。

带有 VOID 返回类型的方法/函数中的多行编译时代码块未被正确编译。这一问题已得到修复。

编译器现在允许在代码块中为参数指定类型。由于代码块定义需要类型为 USUAL 的参数,这将被编译器转换。参数仍将是类型为 USUAL,但在代码块内部将分配适当类型的本地变量。因此,现在可以编译这段代码。

  { | s as string, i as int| s:SubString(i,1) }

代码填充缺失参数时,在传递参数给 COM 调用(Peter Monadjemi 的 Word 示例)时出现问题。

修正了向接受对象的函数传递 IntPtr、VOSTRUCT 地址的类型指针的问题。

我们添加了向 PSZ 添加一个整数值的代码,这样就产生了一个新的 PSZ,它从原始 PSZ 中的一个相对位置开始。不会分配新的缓冲区。

我们更正了复杂集合初始化程序的一个问题。

以 DEFINE 作为参数的 Chr() 和 _Chr()(如 _Chr(ASC_TAB))未被编译器正确解析。

编译器没有正确解析 PUBLIC MyVar[123] 的语法。现已修复。

一些特殊字符(如Micro Character, U+00B5)不被编译器识别为有效的标识符。现在,我们采用了与 C# 相同的标识符规则。

在 OBJECT 类型的值中传递指针或 PSZ 时,现在是通过 “装箱” 变量来处理的。因此,NULL_PTR 不再作为 NULL_OBJECT 传递,而是作为包含 IntPtr.Zero 值的对象传递。

编译器现在允许将 IntPtr.Zero 存储到一个常量变量中

现在,编译器允许通过编写双引号在字符串中嵌入引号。这样就可以了:

? "Some String that has an embedded "" character"

当您声明一个与函数同名的 MEMVAR 时,编译器将不再有任何问题来解析函数调用。请注意,您必须声明 memvar 才能使该解析生效。
例如:

 
 FUNCTION Start() AS VOID
 MEMVAR Test
 Test := 123     // 赋值给内存变量
 Test(Test)     // 用 “Test ”的值调用 “Test ”函数
 RETURN
 FUNCTION Test(a)
 ? a
 RETURN a

 

 

公共运行时

Workareas 类不再使用包含 4096 个元素的数组,而是使用字典来保存打开的 RDD。这减少了运行时状态所使用的内存。

修复了 WrapperRDD 类中的一个问题

OrdSetFocus() 现在以 STRING 返回上一个活动标记

修正了 FRead() 中的一个问题,它没有按规定忽略 SetAnsi() 设置

为 PSZ + LONG 和 PSZ + DWORD 的 PSZ 类型添加了操作符。

Usual 类现在实现了 IDisposable() 接口。当它包含一个实现 IDisposable 的对象时,它将调用该对象的 Dispose 方法。

我们添加了具有一个和两个数字索引的数组索引属性,使访问数组元素的代码更快一些

代码 SELECT 10 无法正常工作。现已修复。感谢卡尔-海因茨。

即使尝试将 order 设置为不存在的索引,VoDbOrdSetFocus() 的返回值仍为 TRUE。该问题已得到修复。

我们修正了 Set(_SET_CENTURY) 在传递的参数是 “ON ”或 “OFF ”格式的字符串时出现的问题

即使无法选择所选 order,VODbOrdSetFocus() 仍然返回 TRUE。

ArrayCreate<T> 未填充数组。该问题已得到修复。

现在,CToD() 函数将忽略尾部空格或前导空格。

使用 2 个参数调用 VoDbSeek() 现在不会将 lLast 设置为 FALSE,而是设置为当前范围的最后值。

在之前的版本中,错误堆栈跟踪的格式发生了变化(名称全部大写,与 VO 中的一样)。现在您可以选择启用或禁用。我们添加了一个函数 SetErrorStackVOFormat(),它接收并返回一个逻辑值。对于 VO 和 Vulcan 方言,错误堆栈的默认格式是 VO 格式,而对于其他方言,默认格式是正常的 .Net 格式。

我们已经实现了 StrEvaluate() 函数。

我们实现了 PtrLen() 和 PtrLenWrite() 函数。这些函数仅适用于以 x86 模式运行的 Windows 操作系统。
对于其他操作系统或运行于 64 位的应用程序,这些函数返回与 MemLen() 相同的值。

当 2 个浮点数相除,因除数为零而产生 NaN(非数值)值时,现在会产生一个 DivideByZero 异常。

当除数为零时,2 个常用数相除的结果是一个 NaN(非数字)值,此时将产生一个 DivideByZero 异常。

请注意,对 2 个 REAL8(System.Double)值进行除法运算仍然会出现 NaN,因为我们没有 “介入 ”除法运算。

现在,当在 Windows 上运行时,OS() 函数会返回更合适的版本描述。它从注册表中读取版本名称,并在版本中包含 x86 和 x64 标志。

RDD 系统

在共享模式下写入记录时,DBF RDD Now 会强制刷新磁盘。

修复了 DBFCDX rdd 中一个可能损坏索引的问题。

我们在 DBFCDX RDD 中内置了一个验证例程,用于验证当前标志的完整性。要调用该例程,请使用 DBOI_VALIDATE 常量调用 DbOrderInfo。
这样就可以验证:

如果所有记录在索引中都恰好包含一次

如果索引中每条记录的值都是正确的

如果页面中索引键的 order 正确

如果索引中的索引页列表是正确的

如果发现问题,该调用将返回 FALSE,并写入一个文件,文件名为 <BagName>_<TagName>.ERR,其中包含所发现错误的描述。

Workarea 类(XSharp.Core 内)和其他 RDD 类中的大部分导出变量已更改为 PROTECTED。
我们还为需要从 RDD 外部访问的变量添加了一些属性

修正了从范围 CDX 索引中的 BOF 位置反复跳回时出现的问题。

DBFCDX 的 Zap() 操作没有清除一个内部缓存。这一问题已得到修复。

DBFCDX 驱动程序现在可以在 CDX 文件中的最后一个标记被删除后关闭并删除该文件。

宏编译器

宏编译器无法将 0000.00.00 识别为空日期。现已修复。

现在,宏编译器也能像普通编译器一样在标识符中使用异国字符。我们添加了与 C# 编译器相同的标识符名称规则。

 

XBase++ 函数

修正了 XPP 函数 SetCollationTable() 中的一个问题

DbCargo() 现在还可以将工作区 cargo 值设置为 NULL 或 NIL

我们添加了几个函数,如 PosUpper()、PosLower()、PosIns() 和 PosDel()。

 

VFP 函数

为 FoxPro 添加了 AllTrim()、RTrim()、LTrim() 和 Trim() 变体(感谢 Antonio)

已添加 StrToFile() 和 FileToStr() (感谢 Antonio 和 Karl Heinz)

 

VOSDK

我们在 CSession 和 CSocket 类上创建了一个 Destroy() 方法,这样就可以 “清理 ”对象(在 VO 中可以调用 Axit(),但现在已经不允许了)。这些类的反构造函数也将调用 Destroy()。

修正了 TreeView:GetItemAttributes 中的一个问题。现在也可以使用 hItem 调用该属性(这在 TreeViewSelectionEvent:NewTreeViewItem 中发生)。

OpenDialog 类现在可以调整大小。

修正了 FormattedString:MatchesTemplChar() 中的一个问题,该问题会导致带有图片的编辑控件出现问题

调用 DataWindow:__DoValidate() 后期绑定不起作用,因为有两个重载。这一问题已得到修复。请注意,在 VO SDK 中,DataWindow:__DoValidate() 希望使用 Control 类型的参数,但在 DataBrowser 代码中,调用时使用的是 DataColumn 类型的参数。VO 没有抱怨,但在 .Net 中却行不通!

修正了 Internet 类中 GetMailTimeStamp() 的一个问题。

我们包含了 Consoleclasses、SystemClasses 和 RDD 类的 “类型化 ”版本。这些类大多是强类型的,可以在 AnyCPU 模式下运行。
SQL 类和 GUI 类将随后推出。

Visual Studio 集成

代码模式

我们完全重写了后台解析器和代码模型,它用于解析 VS 编辑器中的 “实体”,并用于生成 VS 解决方案中类型、方法、函数等的内存模型。该解析器现在使用与编译器相同的词法,但实体是用手写解析器收集的(因为编辑器缓冲区中的代码可能包含不完整的代码,我们无法可靠地使用普通解析器)。

我们现在使用 SQLite 数据库在会话之间持久保存代码模型。这减少了 X# 项目系统所需的内存。我们不再将整个代码模型保存在内存中。

这也意味着,当您重新打开现有解决方案时,我们只需解析自上次处理以来已更改的文件。这将加快大型 VS 解决方案的加载速度。

现在,我们还使用 Mono.Cecil 库,而不是 System.Reflection 命名空间中的类,从外部代码(程序集引用和非 X# 项目的项目引用)中读取类型信息。这样做速度更快,占用内存更少,最重要的是,当程序集发生变化时,我们可以轻松卸载和重新加载程序集。

综上所述,打开 VS 解决方案的速度应该会更快,“锁定 ”VS 的情况也会减少(希望完全不会)。此外,代码自动补全和其他 intellisense 功能也会得到改进。

 

源代码编辑器

修正了当光标位于第一个实体之前的一行代码中时,编辑器上方下拉组合框的一个问题。

修正了一个问题,即在类声明之后,编辑器中的函数没有可折叠区域

现在,编辑器内的代码自动补全功能不仅能获取类型本身的扩展方法,还能获取由这些类型实现的接口的扩展方法。

编辑器代码现在可以正确识别使用 VAR 关键字声明的变量(如果这些变量后面有构造函数调用)。

如果在源代码中为解决方案中的实体添加了 XML 注释,Visual Studio 中的工具提示和参数补全就会显示这些注释。

修正了 “重新格式化 ”代码中的几个问题

Windows 窗体编辑器

Windows 窗体使用的类内对字段的某些内联赋值可能导致窗体编辑器无法使用窗体。这一问题已得到修复。

Windows 窗体编辑器有时会删除实体之间的空行。这一问题已得到修复。

Windows 窗体编辑器解析的代码中的用户自定义命令在窗体更改和保存时无法识别并消失。这一问题已得到修复。

修正了使用项目资源文件中存储的资源(在源代码中以 “global:: ”为前缀)设置图像和类似属性的问题

VOXporter

我们添加了将 AEF 中的 VO 表格导出为 XML 格式的支持

我们添加了将 AEF 中的 VO 菜单导出为 XML 格式的支持

 

Changes in 2.4.1.0 (Bandol GA 2.4a)

编译器

Core 方言现在不再支持括号字符串,以避免在 GET 和 SET 关键字之间包含属性的单行外部特性(attributes)声明出现问题

在 EXTERN 修饰符之后,PROPERTY 关键字不能被正确识别。

修正了包含 2 个数字常量的 IIF 表达式的 XS9021 警告

在 FoxPro 方言中,现在总是允许对某些类型(即使未启用 /lb 编译器选项)进行后期绑定调用,例如 USUAL 和 Empty 类。 这些类型在运行时都标有 AllowLateBound 属性。
它们会生成新的编译器警告 (XS9098).

我们添加了一个新的编译器选项 -fox2 。该选项可使宏编译器看到局部变量,在使用内嵌参数的 SQL 语句时也应使用该选项。该编译器选项必须与 -memvar 和 FoxPro 方言结合使用。

运行时

修正了在使用 DbServer:AppendDelimited() 和 DbServer:CopyDelimited() 时 DELIM Rdd 中出现的问题。

修正了 DbSetOrder() 在未找到 order 时仍返回 TRUE 的问题。

修正了 File() 函数在使用通配符时返回 FALSE 的问题

SqlExec() 现在可为具有单独 Date 类型的 SQL providers 返回 Date 类型的列

使用 SqlExec() 创建的工作区/游标现在可以根据从后台读取的设置正确设置 NULL 标志、二进制标志等。

修正并添加了 VFP 函数(Gomonth、Quarter、ChrTran、各种变化中的 At、各种变化中的 RAt、DMY、MDY)的实现。感谢卡尔-海因茨。

参数化 SQL 函数的第一项工作。尚未完成。

运行时中的某些类型现在标有特殊的 “AllowLateBound ”属性。即使未启用 /lb 编译器选项,FoxPro 方言也将接受这些类型作为后期编译的候选类型。

我们为宏编译器添加了通过名称访问局部变量的支持。这已内置于 VarGet() 和 VarPut() 函数以及 MemVarGet() 和 MemVarPut() 函数中。与同名的 private 变量或 public 变量相比,局部变量具有优先权。为此,您必须启用 -fox2 编译器选项。

ValType() 现在对 currency 值返回 “Y”,对日期时间值返回 "T"

在垃圾回收器线程中访问运行时状态时,不会创建该状态的副本。

现在,当执行无效 SQL 语句时,SQLExecute() 返回-1。

已添加 VarType() 函数

当方法返回 NULL_STRING 且返回类型为 STRING 时,IVarGet() 和 Send() 现在会返回空字符串

RDD

获取范围索引的 OrdKeyNo 会将索引位置重置为索引顶部。这会影响浏览器中作用域索引的滚动条

VOSDK

控制台类程序集现已标记为 AnyCpu。

修正了上一个版本中引入的一个问题,即从 Shell32.DLL 导入的某些函数(如拖放支持)的调用约定。

修复了在远程桌面上运行时,PrintingDevice 构造函数中读取打印机的问题

我们使用 <var> IS <Type> 结构对 IsInstanceOf 的几次调用进行了修改

修正了多个 IsInstanceOf() 调用中的拼写错误

改进 DataBrowser 类的 “column scatter” 代码

Visual Studio 集成

如果您从 XSharp 编辑器选项中的 “提交完成列表 ”控件中删除了所有字符,那么重启 VS 后,所有默认字符都会出现。现在我们会记住你已经清除了列表,并且不会再重新填充列表。

修正了一个问题,该问题导致编辑器无法重新扫描当前缓冲区中已更改的实体

为新的 -fox2 编译器选项添加了项目属性

VO MDI 模板现在已启用拖放功能

修复了调试器中某些运行时类型(如 DATE)的一个问题,该问题可能会在 VS 2019 调试时导致异常。

修复了编辑器代码中负责显示可折叠区域以及用类型名称和成员名称更新组合框的部分的问题。

修复了 VO 兼容表单编辑器中选项卡页面的代码生成问题

 

Changes in 2.4.0.0 (Bandol GA 2.4)

编译器

修正了某些整数运算仍会返回错误变量类型的问题

无符号整数类型(BYTE、WORD、DWORD、UINT64)的一元减运算符返回的类型与原始类型相同,因此不会返回负值。这种情况已得到改变。现在,该运算符的返回值是下一个较大的有符号整数类型。

在插值字符串中使用编译器宏(如 __VERSION__ )会导致编译器出现内部错误。这一问题已得到修复。

vo11 编译器选项现在只适用于整数和非整数类型之间的操作。由于混合整数类型的 VO 行为令人困惑,而且无法模拟,因此删除。

现在还能识别 RETURN 和 GET 关键字后的括号字符串。

运行时

修正了从日期减去 dword 时出现的问题(与编译器中的有符号/无符号问题有关)

LUpdate() 现在会在工作区没有打开表时返回 NULL_DATE。

已添加缺失的 ErrorStack() 函数(感谢 Leonid)

为 Error 类添加了 Stack 属性

添加了 Visual FoxPro 的 SQL..() 函数。请注意,目前还不支持在 SQL 语句中嵌入参数的 SQLExec() 和 SQLPrepare()。这需要对编译器进行修改,计划在下一个版本中进行。

已添加 DbDataTable() 函数,该函数可返回一个(分离的)数据表,其中包含当前工作区的数据

已添加 DbDataSource() 函数,该函数可返回附加到当前工作区的绑定列表。绑定列表中属性的更新将直接写入所附工作区。

已添加 2 个类 DbDataTable 和 DbDataSource,它们由同名函数返回。

修正了带数值的 USUALs 格式不正确的问题

我们已将 FoxPro.h 中的定义添加到 VFP 程序集中

我们添加了 VFP MessageBox 功能,包括超时后自动关闭的消息框。

修正了 AsHexString() 以显示存储在 USUALs 中的大 DWORD 值

修正了 FLOAT->STRING 转换时与 VO 的若干不兼容问题

RDD 系统

修复了在 DBFCDX 表中向后跳过作用域的问题

修复了使用 DBFCDX 和 DBFNTX 驱动程序创建唯一索引的问题

现在始终支持向 DBF 列写入 NULL 值。如果列是 DBFVFP 表中的可为 NULL 值的列,则会设置 null 标志。对于其他 RDD,NULL 值将被写为空值。

修正了对所有基于 DBF 的 RDD 进行 Append 操作时的性能问题

修复了 DBFCDX 驱动程序的一个问题,该问题可能会在索引页面几乎满载全部为空的键值对时发生

修正了 WrapperRDD:Open() 中的一个问题

添加了 SDF RDD

添加了一个特殊的 DbfVFPSQL RDD,VFP 支持中的 SQL..() 函数使用该 RDD 来存储 SQL 查询的结果。可以使用 DbFieldInfo() 和 DBS_COLUMINFO 定义从 Sql Resultset 中检索描述原始列的列信息。该调用的返回值是一个 XSharp.RDD.DbColumnInfo 类型的对象。

已添加 DELIM RDD 和 2 个子类(CSV 和 TSV)。这些 RDD 均返回分隔值。DELIM RDD 的默认格式是使用逗号作为分隔符。CSV 使用分号,TSV 使用 Tab 来分隔字段。此外,CSV 和 TSV 还会写入包含字段名称的标题行。
"普通" 分隔操作仍使用 DELIM。如果要使用 CSV 或 TSV RDD,则需要设置全局设置:

RddSetDefault("DBFNTX")
DbUseArea(TRUE,"DBFNTX", "c:\Test\TEST.DBF")
DbCopyDelim("C:\test\test.txt")             // 这使用了 DELIM RDD
 
RuntimeState.DelimRDD := "CSV"             // 告诉运行时使用 CSV RDD 进行分隔写入
DbCopyDelim("C:\test\test.csv")             // 这将使用 CSV RDD
 
RuntimeState.DelimRDD := "TSV"             // 告诉运行时使用 TSV RDD 进行分隔写入
DbCopyDelim("C:\test\test.tsv")             // 使用 TSV RDD
DbZap()
 
RuntimeState.DelimRDD := "CSV"             // 告诉运行时使用 CSV RDD 进行分隔读取
DbAppDelim("C:\test\test.csv")             // 这将使用 CSV RDD

VO SDK

PrintingDevice:Init() 不再尝试从 win.ini 中读取默认打印机,而是从注册表中读取默认打印机。

更新了代码仍在访问 win.ini(使用 GetProfile..() 函数)的其他几个位置。

GUI 类延迟加载对普通对话框 DLL 和 winspool.drv 的多次调用。现在情况有所改变,因为在 .Net 中不再需要这些调用。

清理了 GUI 类中的所有 PSZ(_CAST 操作。

Visual Studio 集成

OUT 变量的参数提示显示为 REF

未找到带有 REF 或 OUT 参数的成员的 XML 说明

修复了 VS 编辑器中的一个异常

VOXporter

此版本无任何更改

 

Changes in 2.3.2 (Bandol GA 2.3b)

编译器

已添加对括号字符串的支持([包含引号的字符串:''和' ] )

已添加对使用 &Id 和 &Id.Suffix 符号的 PRIVATE/PUBLIC 语法的支持

以前创建 EXE 文件时没有清单,除非您使用的是有清单的 WIN32 资源。现在,当没有提供清单时,该清单会正确添加到 EXE 文件中。

与版本资源和清单相关的非托管资源的处理方式发生了变化:

o编译器检测本地资源时,现在会检查是否包含版本和/或清单资源。

o如果没有清单资源,则会将默认清单资源添加到 Win32 资源文件的资源中。

o当存在版本资源时,该版本资源将被编译器根据 Assembly 属性生成的版本资源所取代。

o这将对来自 VO 的用户有所帮助,他们可以对所有程序集(包括具有菜单和窗口资源的程序集)使用 AssemblyVersion 等。
如果源代码中恰好有版本信息资源,则该资源将被忽略。

o当然,我们添加了一个命令行选项来抑制这种情况:如果使用命令行选项 "-usenativeversion" ,则将使用 Win32 资源中包含的本地版本。如果 Win32 资源文件中没有包含版本资源,则该命令行选项将被忽略。

ACCESS/ASSIGN 方法中现在支持 PCOUNT() 和 ARGCOUNT()。可以传递的参数数量仍然是固定的,但这两个函数现在将返回在 ACCESS 和/或 ASSIGN 方法中定义的参数数量。

我们修正了编译器错误 “Failed to emit module”,而不是显示代码中真正问题(类型缺失)的问题。

预处理器中的扩展匹配标记,如 USE udc 中的 <(file)> 现在也能正确匹配文件名。

改进了区分括号表达式和类型转换的检测算法。这种算法现在是

o括号之间的内置类型名称总是被视为类型转换。例如 (DWORD)、(SHORT) 等。

o括号之间的其他类型名称可能被视为类型转换,但也可能被视为括号表达式。这取决于括号后面的标记。如果该标记是运算符,如 +、-、/ 或 *,则视为括号表达式。如果结尾括号后的标记是开头括号,则表达式被视为类型化表达式。举例如下

? (DWORD) +42              // 这是一种类型转换
? (System.UInt32) +42   // 这是一个括号表达式,无法编译
? (System.UInt32) 42   // 这是一个类型转换,因为在 42 之前没有运算符
? (System.UInt32) (+42) // 这是一个类型转换,因为 +42 位于括号之间

调用 Axit() 方法的代码现在会产生编译器错误。

我们使用了 /vo11 编译器选项

我们更正了几个已签名/未签名警告

现在,您可以对存储在结构内部的类型化函数指针使用 PCall()(这在 VO Internet 服务 SDK 中使用)。

词典现在可以识别(在 FoxPro 方言中)For() 和 Field() 函数,您不再需要在这些函数前添加 @@。

运行时

修正 StrZero() 的负值问题

修复 IsSpace() 在字符串为空或 null 时崩溃的问题

VFP 方言中的 AFill() 现在也能填充子数组中的元素(适用于多维数组)

NoIVarGet() 和 NoIvarPut() 不再将 IVar 名称转换为符号。这样,在一个类中调用 NoIVarGet() 和 NoIVarPut() 方法时,就能保持原来的命名方式。

VFP 和 XPP Abstract 类现在是真正的抽象类。

实现 VFP Empty 类。

实现了 VFP AddProperty 和 VFP RemoveProperty 函数。

修正了 PropertyVisibility 枚举名称中的一个错字

修正了在调用 DBF 相关函数时出现的若干错误,这些函数适用于不包含打开表的工作区。

在 FoxPro 方言中运行时,Seconds() 函数现在可以返回 3 位小数。请注意,您必须添加 SetDecimal(3) 才能真正看到第三位小数

Like() 函数现在在 FoxPro 方言中区分大小写,而在所有其他方言中则不区分大小写。_Like() 函数在所有方言中都区分大小写。

ASort() 不接受 Object() 类型的第 4 个参数。现已纠正:当您传递一个具有 Eval() 方法的对象时,将调用该方法来确定正确的排序顺序。

使用 Set() 函数设置/恢复全局状态时,运行时同步的某些值可能会不同步。这可能导致不正确的日期格式或类似错误。这一问题已得到修复。

添加了多个 VFP 兼容功能(其中一些由 Thomas Ganss 提供)。

我们添加了几个 VFP 功能,例如

使用 Set() 函数设置 “全局设置 ”时,运行时会确保相关设置也相应设置。例如,设置 Set.DateFormat 现在也会更新 DateFormatNet 和 DateFormatEmpty。

修复带有非标准填充物的 PadC() 函数

我们为 FoxPro 特有属性添加了 DBOI_COLLATION 和 DBS_CAPTION。

VO SDK

我们已从图形用户界面类源代码中删除了版本信息资源。现在,版本信息由程序集属性生成

我们已清理了代码,并从抑制警告中删除了警告 9020 和 9021,因为编译器现在可以正确处理这些警告。

RDD 系统

当 DBC 文件被他人独占时,DBFVP 驱动程序不再无法打开 DBF

已添加对使用 DBS_CAPTION 读取标题和使用 DBOI_COLLATION 读取 collations 的支持

DBFNTX 驱动程序在创建新索引时未正确设置 HPLocking 标志

Visual Studio 集成

使用 VAR 关键字声明的变量的类型查找有时会陷入无限循环。这一问题已得到修复。

现在只有选中常规编辑器选项中的 “隐藏高级成员 ”复选框时,以“__”开头的成员才会从完成列表中隐藏。

已添加对 BRACKETED_STRING 常量着色的支持

修正了关键字大小写同步代码中的一个错误。

VS 表单编辑器后面的代码在声明没有返回类型的方法时存在问题。因此无法打开表单。这一问题已得到修复。

改进了定义和枚举成员的 intellisense 信息

现在,您可以在项目属性对话框中启用/禁用 /vo11

VOXporter

从剪贴板内容移植时,现在 VOXporter 会将修改后的代码放回剪贴板

添加了移除 ~ONLYEARLY 实用程序的选项

安装

安装程序现在有了一个新的命令行参数“-nouninstall”,可以防止自动安装以前的版本。这样就可以同时安装多个版本的 X#。
请注意,安装程序会将注册表键值设置为上次安装 X# 的位置。Visual Studio 集成将使用该位置来定位编译器。
如果不更改,所有 VS 安装将始终使用上次安装的 X# 版本。有关该机制如何工作的信息,请参阅 VS 和 MsBuild 的生成过程
此外,如果您选择在 GAC 中安装 X# 运行时程序集,那么这些运行时 DLL 的较新版本将/可能会覆盖旧版本。这取决于较新的 DLL 是否有新的程序集版本。
目前,所有 X# 运行时动态链接库(仍然)都是 2.1.0.0 版本,即使 X# 本身现在是 2.3.2 版本。

安装程序现在会列出所有找到的 VS 2017 和 VS 2019 实例,包括 Visual Studio Buildtools,因此您可以选择在这些版本的 Visual Studio 的特定实例中安装,或者直接在所有实例中安装。
请注意,在使用 -nouninstall 命令行选项运行 X# 时,安装程序将无法将 X# 从之前安装过它的 VS 安装中移除。

我们在帮助文件中添加了一些关于所有安装程序命令行选项的 文档

文档

修正了转义码文档中的错误

我们添加了一个提示和技巧章节,目前包含以下主题。

添加了对安装程序的说明 命令行选项

添加了对 VS 和 MsBuild 的生成过程 的描述

添加了描述 X# 运行时中方言 "不兼容" 的主题。请注意,该主题尚未完成。

如何在启动时捕捉错误

编译器在启动代码中的魔法

编译器生成的特殊类

 

Changes in 2.3.1.0 (Bandol GA 2.3a)

编译器

在大小写敏感模式下编译时,编译器现在会检查子类声明的方法是否与父类中的方法只有大小写上的区别

关于向 foreach iterator 变量赋值的警告信息已从 “无法赋值 ”更改为 “不应赋值”。

#pragma warnings 无法使用 xs1234 语法,只能使用数字。现已更正

 

运行时

为 IRdd 接口添加了 SetFieldExtent 方法

USUAL 类型不再 “缓存 ”方言设置

修正了 ACopy() 在跳过参数或负参数时的一些问题。

Alias() 的返回值现在使用大写字母。

VO SDK

VO SDK Console 类现在内部使用 System.Console 类。唯一不再可用的功能是

o它不再响应鼠标

o不支持创建 “新 ”控制台窗口。

RDD 系统

修正了 Advantage RDDs 中的一个问题,该问题是由大小写问题引起的(子类中的方法与试图覆盖的父类中的方法的大小写不同)。因此,我们还在编译器中添加了一项检查。

在某些情况下,使用 DBFNTX 驱动程序创建 NTX 可能会因时间问题而失败。这一问题已得到修复。

Visual Studio 集成

修正了关键字大小写同步中可能损坏编辑器内容的问题。

 

Changes in 2.3.0.0 (Bandol GA 2.3)

编译器

源文件中的语法错误 (1003) 或解析器错误 (9002) 可能导致错误列表中出现多个错误。现在我们只报告源文件中这些错误类型中的第一个。

启用 -cs(大小写敏感标识符)编译器选项

编译器现在会将编译时代码块的源代码作为字符串包含在该代码块中。在编译时代码块上调用 ToString() 将获取该字符串。

修正了一个问题,即内存变量在传递给 DO <proc> WITH 语句时不会更新

在类型化代码中访问或赋值未定义的属性或调用未定义的方法会产生编译器错误。现在,编译器会检测类型是否有 NoIVarGet()、NoIVarPut() 或 NoMethod() 方法,如果找到相应的方法,就会生成编译器警告 (XS9094) 而不是编译器错误。

使用 LOGIC(_CAST,numValue) 结构将数字转换为逻辑值时,只能查看 numValue 的最低字节。如果最低字节为零,而较高字节不为零,结果将是 FALSE。现在编译器将其编译为 (numValue <> 0)。

编译器现在支持 IF 语句的(可选)THEN 关键字

已添加对 FoxPro CURRENCY 类型的支持。

在 PROPERTY SET 方法中,Value 关键字始终以小写编译

现在可以在行尾检测到未终止的字符串。

为 FoxPro 添加了ENDTRY UDC

已添加对 #pragma warning(s) 的支持。更多信息,请参阅帮助文件中的 #pragma warnings

已添加对 #pragma options 的支持。参见 #pragma options

运行时

添加了 XSharp.Data.DLL,其中包含 RDD 系统使用的基于 .Net SQL 的数据访问支持代码和新的 Unicode SQL 类。

当未传递 FOR 块或 WHILE 块时,DbEval() 引发异常

当求值块不返回逻辑表达式时,DbEval() 引发异常

OrdSetFocus() 的工作区事件有一个错误,即使事件成功,也会导致该事件出现 “操作失败 ”错误。

包含 STRINGS 的 USUAL 上的索引运算符(仅在 Xbase++ 方言中支持)没有考虑到索引已经为零的情况

在日期或逻辑字段的长度不正确的情况下调用 DbCreate() 时会出现异常,现在已自动更正。

添加了将 STRING 类型的 USUAL 值转换为 STRING 的修复。

修正了当区域为 “NIL ”或 “M ”时,__FIeldSetWa() 中的一个问题。

添加了 FoxPro CURRENCY 类型。USUAL 变量也支持这种类型。在内部,CURRENCY 变量的值存储为十进制,但四舍五入到小数点后 4 位。

大多数运行时 DLL 现在都以大小写敏感模式编译。

修正了 STOD() 函数中的一个问题,允许字符串长度超过 8 个字符。

我们在运行时添加了一些 VFP 函数,如 Just...() 函数和 AddBs()。其他一些函数已经存在,但尚未实现。这些函数被标记为 [Obsolete] 属性,调用时将抛出 NotImplementedException 异常。

在 Windows 上运行时,低级文件 IO 系统现在使用本地 Windows 文件访问,而不是托管访问。这也会影响 RDD 系统。

修正了 ACopy()、Transform() 和 Str() 中的问题

VOSDK 类

新增了 DbServer:FieldGetBytes() 和 DbServer:FieldPutBytes() 以读取字符串字段的 “原始 ”字节。请注意(在 ccOptimistic 模式下)字节值不会被缓存,调用 FieldPutBytes() 时必须手动锁定和解锁服务。

添加了几个缺失的定义

将 VO SDK 同步到 VO 2.8 SP4 SDK。唯一未包含的更改是 DateTimePicker 类中的更改。这些更改导致了与 X# VOSDK 中现有代码的冲突。

RDD 系统

Advantage RDD 的标题大小会导致异常。现已修复

修正了 DbRlockList() 和 advantage RDD 的一个问题

在 Advantage RDD 的 cursor 中跳转不会刷新相关表的 EOF 和 BOF 标志

修正了在 FPT 文件中写入字符串的问题

AX_Get.. Handle() 函数没有正确返回句柄

我们添加了几个缺失的与 Advantage 相关的函数。

在创建新文件时,DBFVFP 驱动程序没有将 DBC 反向链接块写入文件头,导致记录数为负数。

我们为 DBFVFP 驱动程序添加了从 DBC 文件读取字段名的(临时)支持。因此,在索引表达式中使用长字段名的 CDX 文件现在也能正确打开了

修正了 DBF RDD 的 CopyDb() 代码中的一个问题

DBFCDX RDD 现在可以实现 BLOB_GET、BlobExport() 和 BlobImport() 。

Pack、Zap 或重建带有自定义或唯一标记的 CDX 索引时,将无法保留这些标记。这一问题已得到修复。

使用 DBFVFP 驱动程序创建文件时,现在可以在 DbCreate() 数组的字段类型中包含字段标记,方法是在类型后面加上冒号和一个或多个标记,其中标记为以下其中之一:
N or 0:        Nullable
B                Binary
+                AutoIncrement
U                Unicode.  (不受 FoxPro 支持)
其他标记也可能随之出现(例如,Harbour 也有 E = 加密和 C = 压缩标记)
注意:

o请注意,字段的大小是字节数,因此{“NAME”, “C:U”,20,0}声明了一个包含 10 个 Unicode 字符和 20 个字节的 Unicode 字符字段。

o我们不验证标志的组合。例如,AutoIncrement 只适用于 Integer 类型的字段。

除 DBFVFP 驱动程序外,所有 RDD 的 DbFieldInfo(DBS_PROPERTIES) 都返回 5。该驱动程序返回 6 个属性。第 6 个属性是 FLAGS 字段。该字段是 DBFFieldFlags 枚举值的组合。

修正了 Advantage RDD 的 AppendDb() 和 CopyDb() 的一个问题

修正了 DBF RDD 的 Append() 代码中的一个问题。当调用 Append() 时没有写入数据,那么写入磁盘的记录可能会损坏。现在,Append() 方法可直接写入带空白的新记录。

现在,XSharp.RDD.DLL 中 Advantage RDD 的完全限定名称与 Vulcan 的 AdvantageRDD.DLL 中的完全限定名称相同。

我们在通知中添加了 FileCommit 事件。该事件会在工作区提交时发送。

宏编译器

宏编译器现在还能识别 Array()、Date() 和 DateTime() 函数。

修正了别名表达式的问题

在宏编译器希望使用单一表达式的地方,现在也可以在括号之间使用表达式列表。列表中的最后一个表达式被视为表达式列表的返回值

Visual Studio 集成

在 VS 项目系统中启用了编译时区分大小写的选项

"格式化文档"的速度有了很大提高。

现在,“工具/选项 ”中的 XSharp intellisense 选项页面在需要时会显示滚动条。

VO 窗口编辑器中的工具调色板现在有了图标

我们为 VO MDI 窗口和 VO SDI 窗口添加了模板。

生成系统

在编译本地资源时,资源编译器会自动包含一个包含某些定义(如 VS_VERSION_INFO)的文件。

调试器

在调试器中输入观察表达式或断点条件时,现在可以使用基于 1 的数组索引。现在,我们的调试器在计算表达式时会自动减去 1。

VOXporter

修正了 Windows 窗体代码生成中的一个问题

现在,您还可以从剪贴板导出单个 MEF 文件、单个 PRG 文件和数据。

VOXPorter 不会触及 #ifdef ... #endif 之间的代码

 

Changes in 2.2.1.0 (Bandol GA 2.2a)

编译器

在编译包含赋值而非 access 的代码时,尝试读取 access 可能会导致编译器异常。这一问题已得到修复。

运行时

添加了一个缺失的 _Run() 函数

Visual Studio 集成 / 生成系统

修正了一个问题,该问题会导致对话框显示“‘XSharp 项目系统’软件包未正确加载 ”的信息。

修正了当源文件名称包含带重音的 ASCII 字符或其他大于 128 的字符时,为资源编译器写响应文件的问题。尽管问题已经解决,但我们仍建议不要对文件名进行过多处理,因为这些文件名必须从 Unicode 转换为 Ansi 格式,因为资源编译器只能读取 Ansi 格式的响应文件。

修正了某些 快速信息/工具提示 窗口的问题

现在,VO 项目模板在 Vulcan 包含文件的 #include 语句周围添加了一个条件,因为在为 X# 运行时编译时不再需要这些条件。

已添加对调试器中 “Auto ”窗口的支持

观察窗口、断点条件等中的表达式现在可以包含 SELF、SUPER 和冒号分隔符。遗憾的是,它们仍然区分大小写。

VOXPorter

我们现在可以检测到一个类的字段名和 accesses/assigns 是否相同。这在 VO 中是允许的,但在 .Net 中不再允许。在类中,字段名将以下划线作为前缀。

现在,我们在 “Trace ”名称前加上 @@,因为这通常用于在 VS 中有条件地编译跟踪代码。

 

Changes in 2.2.0.0 (Bandol GA 2.2)

编译器

编译器现在可以识别函数 Date()、DateTime() 和 Array(),即使它们的名称与类型名称相同。
`Date()`带有一个参数仍然会被视为将该参数转换为`Date()`,就像下面的例子中一样。
LOCAL dwJulianDate AS DWORD
LOCAL dJulianDate AS DATE
dwJulianDate       := DWORD( 1901.01.01)
dJulianDate        := DATE(dwJulianDate) // 这仍然是从 Date 到 DWORD 的转换
然而,当调用带有 0 个或 3 个参数的 Date 时,要么返回当前日期(如 Today()),要么根据 3 个参数构造一个日期(如 ConDate())。
DateTime() 函数接受 3 个或更多参数并构造一个 DateTime() 值。
Array() 函数的参数与 ArrayNew() 函数相同。

在为 String.Format() 选择重载且通常表达式作为第一引用传递时,我们不再允许编译器选择期望 IFormatProvider 接口的重载之一。

通过引用传递给未类型化方法/函数的参数现在已设置了 IsByRef 标志。您可以通过 IsByRef(uParameter) 检查参数来查询 “By Reference ”参数。请注意,为参数赋值后,该标记将被清除。

编译器现在还允许通过引用将别名字段和 memvar 传递给未类型化函数。甚至允许使用未声明的 memvar。
请注意,对字段和 memvar 的赋值将在函数调用返回后进行。因此,在函数内部,字段或 memvar 仍然保留其原始值。

在插值字符串中使用“: ”作为发送操作符会产生歧义,因为“: ”也可用于为插值字符串添加格式规范。编译器现在可以检测并允许使用 “SELF:”、“SUPER: ”和 “THIS:”。
如果你想安全起见,在其他变量的插值字符串中使用“. ”作为发送操作符,或者干脆不使用插值字符串,而是使用 String.Format,就像在下面的一样:
? String.Format("{0} {1}", oObject:Property1, oObject:Property2)
而不是
? i"{oObject:Property1} {oObject:Property2}"
无论如何,编译器都会生成这样的代码

 

宏编译器

宏编译器现在可以识别并编译嵌套代码块,例如
LOCAL cb := {|e| IIF(e, {||SomeFunc()}, {||SomeOtherFunc}) } AS CODEBLOCK
cb := Eval(cb, TRUE)   // cb 现在将包含 {||SomeFunc()}
? Eval(cb)

在 FoxPro 方言中,宏编译器现在可将 AND、OR、NOT 和 XOR 识别为逻辑运算符

运行时

添加了一些 Xbase++ 兼容函数,如 DbCargo()、DbDescend() 和 DbSetDescend()。

DateCountry 枚举现在还有 System 和 Windows 值,它们都从系统中的区域设置读取日期格式。

我们添加了一个 WrapperRDD 类,您可以继承该类。这样,您就可以封装现有的 RDD,并根据自己的选择对方法进行子类化。有关示例,请参阅 WrapperRDD 文档。

我们在 CollationMode 枚举中添加了一个 XPP 成员,其编号与 Clipper 相同。这让一些用户感到困惑。现在我们给 XPP 成员一个新的编号。

现在,OleAutoObject:NoMethod() 在 Vulcan 方言中的行为有所不同(以便与 Vulcan 兼容)。在 Vulcan 方言中,方法名称会插入参数列表的开头。在其他方言中,参数保持不变,您需要调用 NoMethod() 函数来获取最初调用的方法名称。

运行时状态中的所有设置现在都以默认值初始化,因此运行时状态中的 Settings() 字典将包含所有 Set 枚举值的值。

之前的更改修正了 Set() 函数在使用字符串 “On ”或 “Off ”为逻辑设置值时出现的问题。由于某些设置未使用逻辑初始化,因此无法正常工作。

使用 SetCollation(#Ordinal) 创建索引时,速度会更快一些。

runtimestate 现在有一个 EOF 设置。当设置为 “true ”时(FoxPro 方言会自动这样做),MemoWrit() 将在文本文件后写入一个 ^Z (chr(26)),而 MemoRead()在找到该字符时会将其删除。

runtimestate 现在有了 EOL 设置。默认值为 CR - LF (chr(13)+chr(10))。使用 FWriteLine() 写入文件时,该设置用于行分隔符。

RDD 系统

 

修复了 DBFCDX RDD 中的锁定问题,该问题会在打开多个应用程序之间以及多个线程之间共享的文件时造成问题。现在,RDD 可以正确检测 CDX 是否被其他进程或线程更新。

修复了运行多个线程时文件 IO 系统的一个问题

修正了运行多个线程时 File() 和 FPathName() 函数的一个问题

已添加对 Workarea Cargo 的支持(请参阅 DbCargo())

带有尾部空格的数字列返回值为 0。这一问题已得到解决。

修复了 DBFCDX 驱动程序中的一个问题,该问题会在删除/更新许多键和删除索引页时出现。

修复 DBF RDD EOF 时的读取错误。

VOSDK

修复了在应用程序关闭时调用已关闭服务器的 DbServer 析构函数时出现的问题。

Visual Studio 集成

在一位用户的帮助下,修复了 “括号匹配 ”代码中的速度问题(感谢 Fergus!)。

调试器运行时,您将无法再编辑源代码。

我们在项目属性的生成选项中添加了 “注册 COM Interop ”属性。

我们更新了装配信息模板。它们现在有了 GUID 和 Comvisible 属性。

编辑器缓冲区中的空行有时会引发异常。现已修复

TEXT ... ENDTEXT 之间的文本不再因编辑器中的格式选项(如缩进或大小写同步)而改变。

在编辑器中,不完整字符串的颜色与正常字符串相同。

QuickInfo 和 Completion 列表将遵循关键字编辑器的 “格式大小写 ”设置。

如果没有设置 “工具/选项 ”中的某个选项,那么在加载编辑器中打开文件并保存的项目时可能会出现异常,导致加载的项目中没有可见项目。卸载和重新加载可以解决这个问题。现在这种情况将不再发生。

我们做了一些更改,使解决方案的打开和关闭速度更快。

选择 Visual Studio Dark 主题时,某些颜色难以阅读。这一问题已得到修复。

括号匹配有时会错误地将END CLASS 与 BEGIN NAMESPACE 匹配。这种情况应该不会再发生了。

修正了在某些情况下打开解决方案时出现的异常,该异常会在 VS 中显示错误,说明 XSharp 项目系统未正确加载。

Windows 窗体、设置和资源的代码生成器现在尊重 “工具”-“选项 ”TextEditor/XSharp 页面中的关键字大小写设置。

VOXPorter

以反斜线结尾的文件夹名称可能会混淆 VOXPorter

 

Changes in 2.1.1.0 (Bandol GA 2.11)

编译器

我们为 OUT 参数添加了新语法。现在您可以使用以下语法之一

 
  LOCAL cString as STRING
  cString := "12345"
  IF Int32.TryParse(cString, OUT VAR result)      
 // 这将以内联方式声明 out 变量,其类型来自方法调用
     ? "Parsing succeeded, result is ", result
  ENDIF
  IF Int32.TryParse(cString, OUT result2 AS Int32)  
 // 这将声明内联 out 变量,类型由我们指定
     ? "Parsing succeeded, result is ", result2
  ENDIF
  IF Int32.TryParse(cString, OUT NULL)      
 // 这将告诉编译器生成一个 out 变量,我们对结果并不感兴趣。
     ? "Parsing succeeded"
  ENDIF
  IF Int32.TryParse(cString, OUT VAR _)      
 // 会告诉编译器生成一个 out 变量,但我们对结果并不感兴趣。

       // 名称“_”的特殊含义是 “忽略此内容”。
     ? "Parsing succeeded"
  ENDIF

编译器现在允许使用 Date()、DateTime() 和 Array() 函数名。运行时具有这些函数(见下文)

修正了一个预处理器问题,即当 .not. 或 ! 操作符位于 .AND. 或 .OR. 等逻辑操作符之后时,UDC 内的 <token> 匹配标记会停止匹配标记。

已添加对 <usualValue> IS <SomeType> 的支持。编译器会自动提取 USUAL 的内容并将其封装在一个对象中,然后应用正常的 IS <SomeType> 操作。

修正了插值字符串中无法正确识别“/”字符的问题。

编译器现在支持 cursor 访问的 FoxPro 语法。当动态内存变量被禁用时,它总是被转换为从当前游标/工作区读取字段。
 
  USE Customer
  SCAN
     ? Customer.LastName
  END SCAN
  USE

如果启用了内存变量,那么这段代码也可能意味着您正试图读取名称为 “Customer ”的变量的 Lastname 属性,就像下面的示例一样:
  USE Invoices
  Customer = MyCustomerObject{}
  SCAN
     ? Customer.LastName, Invoice.Total
  END SCAN
  USE
您也可以使用 M 前缀来表示局部变量或内存变量。编译器会首先尝试将变量解析为局部变量,如果失败,则会尝试将变量解析为内存变量(启用动态内存变量时)。

运行时

我们为 FoxPro cursor 访问语法添加了支持功能。

在 Vulcan 方言中,NoMethod() 方法现在接收方法名作为第一个参数(这与 VO 不兼容)

新增了函数 Date()(可有 0 或 3 个参数,相当于 Today() 和 ConDate())、DateTime() 和 Array()。

添加了对接受区域参数的函数进行修复和优化,例如 Used(uArea) 和 Eof(uArea)。

AScan() 和 AScanExact() 现在可在传递 NULL_ARRAY 时返回 0。

 

RDD

从 DBF 中读取负数时出现问题。现已修复

修正了 FPT 驱动程序在 FPT 文件中写入长度为 0 字节的数据块时出现的异常。

DBF() 函数在 FoxPro 方言中返回完整文件名,在其他方言中返回别名。

为完全清空的 DBF 文件创建 CDX 索引时,会为幽灵记录插入索引键。这一问题已得到修复。

 

Changes in 2.1.0.0 (Bandol GA 2.1)

编译器

我们为函数和方法调用中的未类型化参数添加了对引用参数的支持

在 Xbase++ 和 FoxPro 方言中,用“@”传递的参数总是被视为 BY REF 参数,因为这些方言不支持 “AddressOf” 功能。

当使用 /undeclared 时,如果实体添加了一个新的 private 属性,那么当实体退出作用域时,该 private 属性不会被清除。这一问题已得到修复。

编译器未正确处理编译 oObject?:Variable

修正了调用 SELF:Axit() 时的内部编译器错误

DO 语句的参数现在通过引用传递

在编译非 Core 方言时,更改了 “必要” 程序集名称的顺序。

我们新增了对多条 SET 命令的支持,如 SET DEFAULT、SET PATH、SET DATE 和 SET EXACT 等。

运行时

我们做了一些更改,以使 XSharp.Core 能够在 Linux 上运行

我们修复了日期类型减法运算符中的一个问题。这改变了减法运算符的签名,迫使我们增加了运行时的 Assemblyversion。

Xbase++ 方言现在允许在常量内的字符串上使用 [] 操作符。它会返回给定位置上一个字符的子串。

我们更正了 OrderChanged 事件中的一个错误事件

CoreDb.BuffRefresh 向 IRDD.RecInfo() 方法发送了不正确的枚举器值。

IVarList() 函数包含受保护字段和属性。该问题已得到修复。

如果对象属于 CodeBlock 的子类,则无法使用 IsInstanceOfUsual()。这一问题现已得到修复。

我们添加了许多工作区相关函数的重载,这些函数带有一个额外参数,用于指示工作区编号或工作区名称。例如 EoF()、Recno()、Found() 和 Deleted() 函数

我们添加了 Xbase++ collation 表。SetCollationTable() 函数现在可以选择正确的 collation。

多个与数组相关的函数现在可以更好地检查 NULL 数组

错误类中的 SubcodeText 属性现在是读/写属性。当值尚未写入时,将使用子代码编号来查找该属性的值。

MExec() 并不总是计算已编译的代码块。该问题已得到修复。

我们添加了一些缺失的三角函数,如 ACos()、ASin() 等。

在 Xbase++ 方言中,FieldGet() 和 FieldPut() 函数不再因字段号不正确而出错。

我们添加了一个缺失的 MakeShort() 函数和 SEvalA() 函数。

DateCountry 设置现在包括一个系统设置,它将从当前文化的设置中读取日期格式。

宏编译器

宏编译器检测到不明确的方法或构造函数时,会在错误信息中包含这些方法或构造函数的签名。

我们添加了一个新的 IMacroCompiler2 接口,它增加了一个额外的属性 “Resolver”。该属性可接收一个 “MacroCompilerResolveAmbiguousMatch ”类型的委托。该委托的原型如下:
DELEGATE MacroCompilerResolveAmbiguousMatch(m1 as MemberInfo, m2 as MemberInfo, args as System.Type[]) AS LONG

当宏编译器检测到模棱两可的匹配时,将调用该委托,并接收可能候选的 System.Reflection.MemberInfo 和检测到的参数类型数组(编译时检测到)。委托可以返回 1 或 2,以便在任一候选变量中做出选择。任何其他值都意味着委托不知道要选择哪个模棱两可的成员。
如果宏编译器发现有 2 个以上的备选方案,它会首先调用备选方案 1 和 2 的委托,然后再调用从备选方案 2 和备选方案 3 中选出的委托,等等。

您可以将函数或方法注册为新函数的委托
SetMacroDuplicatesResolver()

我们现在可以处理(一级)嵌套宏。因此,宏编译器可以正确编译以下代码块
{|e| iif(e, {||TRUE}, {||FALSE})}

宏编译器现在允许在整数和逻辑之间进行比较(就像运行时中的普通类型一样)。但仍不建议这样做!

宏编译器现在允许使用'['和']'作为字符串分隔符。这在普通编译器中是不允许的,因为这些分隔符无法与属性区分开来。

我们修正了一个问题,即当方法名与 Usual 类型中的方法名或属性名(如名称为 Item() 的方法)相匹配时,需要进行后期绑定调用。

宏编译代码块的 PCount() 总是返回 1。这一问题已得到修复。

VOSDK

修正了代码中未关闭的 DbServer 对象的问题。
现有代码试图通过析构函数关闭工作区。但在 .Net 中,析构函数在一个单独的线程中运行,而在该 GC 线程中没有打开的文件...

删除了对 DbfDebug() 的不必要调用

AdsSqlServer 类现已添加到 VORDDClasses 程序集中

RDD

我们更正了一个关于解析错误或空日期的问题

我们更正了在 Advantage RDD 中读取日期时可能导致堆错误的问题。

我们为 Advantage 支持添加了几个 “缺失 ”功能,这些功能在 VO 的 “Ace.Aef ”中已有

我们新增了对 Character 字段 > 255 字符的支持

DbSetScope() 现在会将记录指针移动到与新作用域匹配的第一条记录上。

使用 SetAnsi(TRUE) 的 DBFNTX 驱动程序 DbCreate() 创建的文件第一个字节为 0x07(或 0x87)。
在 Xbase++、FoxPro 和 Harbour 方言中不再出现这种情况,因为第一个字节只针对 VO

某些 FoxPro 备注值在写入时末尾会多出一个 0 字节。现在,在读取这些值时,这个额外的字节将被抑制。

我们修复了 CDX 文件中版本号未更新的问题,并改进了 CDX 锁定功能。

当索引标题中的标签名称不是大写字母时,Xbase++ 无法识别 NTX 索引。该问题已得到修复。

我们修复了创建 CDX 索引时的一个(性能和大小)问题。

当打开一个没有字节编码的 DBF 文件时,我们默认使用当前的 Windows 或 DOS 编码,具体取决于当前的 SetAnsi() 设置。

优化了numeric、date 和 logical 列的读取

Visual Studio 集成

修复了 WCF Service 模板

我们已将项目系统迁移到异步 API。这将使包含大量 X# 项目的解决方案的加载速度更快一些。

修正了关键字大小写同步中可能导致用户界面锁定数秒的问题

修正了 BraceMatching 代码中的一个异常。

取消行块注释有时会在空行前留下注释。这一问题已得到解决。

我们改进了类型、方法、字段、属性和参数的(XML)文档查找。

我们改进了 X# 项目之间的类型查找。

VOXPorter

现在还可导出 DbServer 和 FieldSpec 实体

VOXPorter 现在还能生成一个单独的项目/应用程序,其中包含 VO 应用程序中 VO 图形用户界面窗口的 Windows 窗体版本。

运行 VOXPorter 时,您现在可以选择导出到 XIDE、Visual Studio 或两者。

 

Changes in 2.0.8.1 (Bandol GA 2.08a)

编译器

修正了预处理器中的递归问题

不再能正确检测 MEMVAR-> 和 FIELD-> 现已修复。

我们更正了 dbcmd.xh 中的几个问题

修正了 Lambda 表达式中 return 语句的一个问题。

= Expression() 语句(FoxPro 方言)未生成任何代码。现已修复。

运行时

XPP.Abstract.NoMethod()和 XPP.DataObject.NoMethod() 仍然将方法名称作为第一个参数。这个问题已得到修复。

由于参数不正确,StretchBitmap() 的效果与 ShowBitmap() 相同。这一问题已得到修复。

Visual Studio 集成

改进了格式化文档代码

修正了 VS 解析器在查找使用 VAR 关键字定义的变量类型时出现的一个问题,该问题可能导致 VS 陷入无尽循环。

TEXT ... ENDTEXT 块的内容以及 \ 和 \\ 标记后的一行现在有了自己的颜色

 

Changes in 2.0.8 (Bandol GA 2.08)

编译器

编译器在 “return ”属性目标上出了问题

现在,“statementblock”(语句块)规则内的错误能被更好地检测出来,编译器不会再在这些正确的代码行之后报告许多错误。

修复了与逻辑转换相关的问题。

修正了将未声明变量用作 For 循环计数器的问题

改进了前缀操作、后缀操作和赋值中 FIELD、MEMVAR 和未声明变量的代码生成。

在涉及默认参数时,改进了参数为 ref 或 out 变量的方法调用的代码生成。编译器现在会为这些调用生成额外的临时变量。

在与此相关的方言中,编译器现在还支持 ENDFOR 作为 NEXT 的别名和 FOR EACH 作为 FOREACH 的别名。

已添加对 DO <proc> [WITH arguments] 语法的支持

运行时

当要创建文件的基本文件名已作为别名打开时,DbCreate() 函数现在会创建一个唯一的别名

现在,USUAL 值的数值溢出检查与主程序的溢出检查相同

DbUnLock() 现在接受记录编号(可选)作为参数

XMLGetChild() 在未找到元素时会抛出异常

XMLGetChildren() 引发异常

修正了 “dbcmds.xh ”中 2 条规则的一个问题

XSharpDefs.xh 文件现在会自动包含 “dbcmd.xh”。

错误报告了一些数据类型错误。

后期绑定代码的 “NoMethod ”方法在调用时使用了不正确的参数。这一问题已得到修复。

修正了将带有 NIL 值的 usuals 转换为字符串或对象时出现的一些问题。

在 Xbase++ 中,Set() 函数也接受逻辑设置值为 “ON ”或 “OFF ”的字符串。我们现在也允许这样做。

Set(_SET_AUTOORDER) 现在可以像在 VO 中一样接受第二个数字参数(Vulcan 使用的是逻辑参数)。

我们在 FoxPro 类层次结构中添加了一些支持类,用于支持 FoxPro 类(Abstract、Custom 和 Collection)。稍后还将添加更多的类。

修正了转换和“@ez ”图片的问题。

VOSDK

修复了 SQLSelect 类中重新打开 cursor 时的一个问题。

RDD 系统

修复了读取 Advantage MEMO 字段的问题

改进了因索引表达式错误(如缺少函数)而无法打开索引时的错误信息

我们添加了在 RDD 系统中安装事件处理程序的选项。更多信息,请参阅主题 Workarea 事件

对于只有 0 条记录的工作区,Skip、Gobottom 和其他更改当前记录的工作区操作将不再把 EOF 设为 FALSE。

在没有设置作用域的情况下,清除 Advantage 工作区中的作用域会产生异常。这一问题已得到修复。

在没有锁定记录的情况下,解锁 Advantage 工作区中的记录会出现异常。这一问题已得到修复。

DbSetRelation() 无法正常工作。现已修复。

VS 集成

修复了 DbServer 和 FieldSpec 实体代码生成中的一个问题

已添加对 DbServer 编辑器中导入和导出按钮的支持

改进了 Xbase++ 方言编辑器内的实体解析。

除非源文件本身有预处理标记,否则 VS 解析器不会对 UDC 标记(包括ENDFOR)着色。这一问题已得到修复。

改进了对新END关键字的块检测。

VS 集成现在可以识别 VFP 类型类的类语法。

修正了代码中的一个问题,即检查哪个项目系统 “拥有” PRG 扩展名。

在 “项目属性 ”页面中添加了编译器选项,以抑制生成默认的 Win32 清单。

VOXporter

VOXPorter 忽略了未在 VO 中正确建立原型的实体。这一问题已得到修复

FoxPro 方言

我们添加了一个编译器选项 /fox1,用于控制对象的类层次结构。启用 /fox1(FoxPro 方言中的默认值)后,所有类都必须从 Custom 类继承。属性代码生成会将属性值保存在自定义类内部的一个集合中。启用 /fox1- 后,属性将生成为带有后备字段的 “auto” 属性。

我们增加了对 FoxPro 类的支持。请参阅 FoxPro class 了解有关哪些有效,哪些无效的更多信息。

我们新增了对 DIMENSION 和 DECLARE 语句的支持(这些语句可创建一个用数组初始化的 MEMVAR)

 

Changes in 2.0.7 (Bandol GA 2.07)

可能的突破性变化

我们删除了标准头文件中的 #define CRLF。现在 XSharp.Core 中有一个 DEFINE CRLF。如果你在针对 Vulcan 进行编译时发现缺少 CRLF 的错误,那么你可能需要在代码中添加以下内容:
DEFINE CRLF := e”\r\n”

编译器

导致标记列表为空的 UDC 会在预处理器中引发编译器错误。这一问题已得到修复。

如果底层数组类中不存在方法,在数组上调用方法将被转换为以方法名称为参数的 ASend()。
如果出现这种情况,编译器会发出警告。

编译器对(USUAL)转换产生了错误的代码。这个问题已经修复。在极少数情况下,这可能会导致编译错误。如果发生这种情况,只需通过调用USUAL构造函数创建一个usual:USUAL{somevalue}

修正了在 CLASS ... END CLASS 之外声明的方法的若干问题

在 FoxPro 方言中,现在允许使用 NOT、AND、OR 和 XOR 作为 .NOT.、.AND.、.OR.和 .XOR. 的替代语法。

在 FoxPro 方言中,您现在可以在文件的第一个实体之前加入语句。编译器会识别这些语句,并自动以源文件的名称创建一个函数,并将这些语句中的代码添加到该函数的主体中。

启用 /vo7 后,编译器现在允许将整数表达式转换为逻辑表达式。对于整数类型的表达式,始终支持 LOGIC(_CAST。

现在,编译器能更早地检测到语言功能的错误使用(如在 Core 或 FoxPro 方言中使用 VOSTRUCT),从而加快了错误代码的编译速度。

现在,当启用 /vo2 时,编译器也会使用空字符串初始化多维字符串数组,就像下面的代码一样:
CLASS TestClass
  EXPORT DIM aDim[3,3] AS STRING
END CLASS

在以前的版本中,如果调用 SELF() 或 SUPER() 的源代码行紧跟在 CONSTRUCTOR() 之后,则无法在该行上设置断点。这一问题已得到修复。

如果项目包含“_DLL METHOD”、“_DLL ASSIGN ”或“_DLL ACCESS”(从 VO 导出后),编译器现在会生成更有意义的错误信息。

当一个源文件包含许多相同的错误时,编译器将不再产生数百条相同的错误信息。每个源文件出现 10 个错误后,编译器只会报告唯一的错误编号。因此,如果您的源代码有 20 条不同的错误信息,那么您仍将看到 20 条错误报告,但如果您的源代码包含 100 次相同的错误类型,那么错误列表将在 10 条错误后被截断。

编译器不再允许代码位于ENDIF 或 NEXT 等结束标记之后。标准头文件 “XSharpDefs.xh ”现在包含了消除这些标记的规则。

运行时

用于 usualtype 的 ++ 和 -- 操作符对日期和日期时间值不起作用

当源文件不存在时,FErase() 和 FRename() 现在会将 FError() 设置为 2

File() 函数曾因路径中包含无效字符而引发异常。现在它返回 FALSE 并设置 Ferror()

一些特定的数字产生了不正确的 Str() 结果。现已修复。

若干类型的 Value 属性名称的大小写从 Value 更改为 VALUE。这给从 C# 代码连接 X# 代码的用户带来了麻烦。现在已恢复原来的大小写。此更改已被撤销。

在某些情况下,错误堆栈不会包含完整的帧列表。这一问题已得到解决。

扩大了错误对话框中关闭和复制按钮的大小,以便为翻译字符串留出更多空间

对于 NIL 值,Pad...() 函数返回的是 “NIL ”的填充版本。这与 Xbase++ 不兼容。现在,它们会返回一个包含所有空格的字符串。顺便说一句:当你调用带有 NIL 值的 Pad..() 时,VO 会抛出一个异常。

修正了 PadC() 函数在数值大于 1 个字符时出现的问题。

我们修改了 Val() 函数,使其与 Visual Objects 更加兼容

运行时包含 Space() 函数的第二个重载,它接受一个 Int 参数。这导致宏编译器出现问题。该重载已被删除。因此,您可能需要修改代码。

修正了 EnforceType() 和 EmptyUsual() 中与 STRING 类型有关的一个问题

AEval 和 AEvalOld() 现在都将数组索引作为第二个参数传递给被求值的代码块

RDD 系统

修正了一个问题,即在打开带索引的空 DBF 时,EOF 和 BOF 未同时设为 true。

修复了 DBFNTX 和 DBFCDX 的 DbSeek() 和 Found() 的一个问题

DBF 类无法正确解码包含 Ascii 字符 > 127 的字段名和/或索引表达式(字段名如 STRAßE)。

在关闭 dbf 时,即使没有任何更改,文件日期也会被更新。该问题已得到修复。

运行时现在包含在关机时关闭所有打开的工作区的代码。这将有助于防止 DBF 或索引损坏。

索引顺序更改后,Advantage RDD 会自动执行 GoTop。现在这种情况不再发生。

Advantage RDD 现在会在失败前重试几次打开 DBF 和索引文件。

修复了 DBFCDX 和 AXDBFCDX 之间的一个小的不兼容问题

VS 集成

Core 类库模板的文件名中有一个错字,导致无法正确加载该模板

Windows 窗体编辑器的代码生成器重复使用 USING 语句。这一问题已得到解决。在设计器中打开和保存表单时,重复的 using 语句将被删除。

编译消息现在仅在生成详细程度为正常或更高时显示在输出窗口上,包括编译时间、警告和错误数量。如果存在编译器错误,警告和错误消息也会显示在较低生成详细程度下。

如果项目文件是用 2.0.1 版或更高版本创建的,项目系统将不再更新项目文件中的版本号。

修正了设置和清除程序集引用的 “特定版本 ”属性时出现的问题。

兼容 VO 编辑器的默认模板现在安装在 XSharp\Templates 文件夹中,当项目中没有模板时,编辑器会将此位置作为 “后备”。

现在,“属性 ”文件夹在 “项目 ”树中被列为第一个子文件夹,而 “VO 二进制文件 ”项目在 “项目 ”树中源代码项目的子文件夹列表中被置于资源项目之前。

VOXporter

VOXPorter 现在以 @@ 作为调试令牌的前缀。

VOXPorter 现在可删除同时声明为 ACCESS/ASSIGN 的属性的 INSTANCE 声明

VOXPorter 现在可在以 .AND 或 .OR. 分隔的变量名之间添加空格。 因此,“a.and.b ”变为 “a .and. b”。

文档

我们已经“提取”了一些 Visual Objects 运行时函数的文档,并将其添加到我们的运行时文档中。这是一个正在进行中的工作,一些主题需要额外的工作。

 

Changes in 2.0.6.0 (Bandol GA 2.06)

常规

我们收到了关于简化版本号的请求。因此,新版本被称为 Bandol 2.06,文件版本也是 2.06。运行时程序集的程序集版本均为 2.0,我们打算尽可能保持这些版本的稳定,因此您不必被迫重新编译依赖于运行时程序集的代码。

2.0.5.0 中应包含的几个修复未包含在对应版本中。这已在 2.0.6.0 中得到纠正。

编译器

缺少 ENDTEXT 关键字现在会产生错误 XS9086

不平衡的文本合并分隔符会产生警告 XS9085

现在,FoxPro 方言中的 TEXT 关键字只有在它是一行中第一个非空格符号时才会被识别。因此,您又可以在预处理器命令中使用 <text> 这样的标记了。

对字面字符串进行 VO 转置操作时,编译器不再就可能的内存泄漏发出警告。

 

运行时

后期绑定代码中的运行时错误总是显示为 TargetInvocationException。这样就隐藏了错误的真正原因。现在我们正在解包该错误并重新抛出原始错误,包括导致该错误的调用堆栈

更新了字符串资源中的一些文本

在长度和/或小数的值为 -1 时调用 Str() 函数,会产生与 VO 不兼容的结果。这一问题已得到修复。

修正了 DBZap() 和带有 DBT 备注文件的一个问题。

在某些情况下,打开空 DBF 文件时 EOF 和 BOF 未设置为 TRUE。这一问题已得到修复。

内部指针不正确的 PSZ 值现在显示为 "<Invalid PSZ>(..)"

 

RDD 系统

在 Advantage 工作区中读取和写入列的代码现在使用单独的 column 对象,就像 DBF RDD 的代码一样。这使代码更容易理解,速度也会更快。

 

VS 集成

TEXT 和 ENDTEXT 之间的文本块现在显示为与字面字符串相同的颜色

与 VO 兼容的项目项目模板不再自动添加对项目的引用

使用此版本的 X# 项目系统打开 2.01.0 及更高版本的项目文件时,将不再 “接触 ”这些文件,因为自该版本发布以来,项目文件格式未作任何更改。

 

VOXporter

生成的 Start 函数中的 CATCH 块现在调用 ErrorDialog() 来显示错误。它使用新的语言资源来显示完整的错误,并提供与 VO 兼容的错误信息(Gencode、Subcode 等)。

 

Changes in 2.0.5.0 (Bandol GA 2.01)

编译器

END PROPERTY 后的空行可能会使编译器感到困惑。现已修复

编译器中已执行 TEXT ... ENDTEXT 命令(仅限 FoxPro 方言)

\ 和 \\ 命令已经实现(仅适用于 FoxPro 方言)

FoxPro 方言中的程序现在可以返回值。此外,/vo9 选项现在在 FoxPro 方言中默认为启用。在 Foxpro 方言中,FUNCTION 和 PROCEDURE 的默认返回值现在是 TRUE,而在其他方言中则是 NIL。

错误信息不再使用 Xbase 类型的内部名称 (XSharp.__Usual) 而使用其正常名称 (USUAL)。

宏编译器

创建带有命名空间前缀的类不起作用。现已修复。

运行时

修正了 ArrayNew() 和多个维度的一个问题

使用数字调用数组类的构造函数时,元素已被初始化。这与 Vulcan.NET 不兼容。现在有了一个额外的构造函数,它接受一个逻辑参数 lFill,可用于自动填充数组。

ERROR_STACK语言资源的文本已更新

使用整数调用 Str() 会返回与 VO 稍有不同的结果。这一问题已得到修复。

添加了 TEXT ... ENDTEXT 和 TextMerge 的支持函数以及输出文本文件。

修正了 DTOC() 函数中的一个问题

现在您可以为程序集添加多个 ImplicitNamespace 属性

我们添加了几个 FoxPro 系统变量(目前只有 _TEXT 有作用)

RDDs

Zap 和 Pack 操作未正确设置 DBF 文件大小

共享模式下的 Append() 无法正确设置 RecCount

使用 Advantage SQL RDDs 之一打开文件不起作用。现已修复。

将 DateTime.Minvalue 写入 DBF 时不会写入空日期,而是写入日期 1.1.1 已修复此问题。

VO SDK

修正了 ListView:EnsureVisible() 中的一个问题。

一些可疑的类型转换(比如导致之前问题的那个)已经被清理掉。

Visual Studio 集成

构造函数调用的参数提示偏差了一个参数。现已修复。

在查找类型时,XSharp 命名空间现在是首先搜索的命名空间。

 

Changes in 2.0.4.0 (Bandol GA)

编译器

修正赋值表达式中的一个问题,即左侧是一个带有括号中工作区的别名表达式:
(nArea)->LastName := AnotherArea->LastName

多行语句(如 FOR 块)不再在调试器中生成多行断点。

修正了一个问题,即类定义后的空行或带有 “非活动 ”预处理器注释的行会产生编译器错误。

如果不支持 INT/DWORD 和 PTR 之间的隐式转换,现在会产生更好的错误信息。

USUAL.ToObject() 在启用 latebinding 编译器选项时无法调用。这一问题已得到修复。

修正了未类型化 STATIC LOCAL 的内部编译器错误。

修正了别名表达式的一个问题。

索引 PSZ 值不再受 /az 编译器选项的影响

宏编译器

修正了一些别名表达式的问题

宏编译器现在能检测到您在自己的代码中重载内置函数,不再抛出 “方法不明确 ”异常,而是选择您代码中的函数,而不是 X# 运行时中定义的函数。

运行时

修正了 Directory() 函数中的几个问题

修复了 PSZ 值索引问题

在错误对象上添加了 StackTrace 属性,这样在 BEGIN SEQUENCE 中捕获的错误也会有堆栈信息。

修正了与 NaN、PositiveInfinity 等 “特殊 ”浮点数值和 ToString() 有关的问题

修正了参数为 null 的 RddSetDefault() 的一个问题

DbInfo(DBI_RDD_LIST) 未返回值。这一问题已得到修复。

我们更新了许多语言资源,此外,Error:ToString() 现在使用语言资源来显示 “参数 ”和 “说明 ”等标题。

低级文件错误现在包括调用堆栈

修正了 AsHexString() 中的一些问题

DosErrString() 不再从语言字符串表中获取信息。这些信息以及 XSharp.VOErrors 枚举中的相关成员已被删除。

添加了土耳其语资源。

RDD 系统

修复 FPT 文件中的锁定问题

修复了 OrdKeyCount() 和过滤器、作用域以及 SetDeleted() 设置中的若干问题

有些 DBF 文件在不支持小数的字段类型的字段定义的 “小数 ”字节中有一个值。这导致了一些问题。现在这些小数将被忽略。

在未作更改的情况下打开和关闭 DBF 会更新时间戳。这一问题已得到修复。

修复了 Pack() 和 Zap() 中的问题

修正了一个意外更新自定义索引的问题。

修正了 OrdKeyCount() 与过滤器、SetDeleted() 和作用域结合使用时的若干问题。

VO SDK 类

现在,大多数程序库在编译时都禁用了 “后期绑定 ”功能,以提高性能。
为了帮助实现这一点,我们添加了一些类型化属性,例如 SqlStatement:__Connection 类型为 SQLConnection.

Visual Studio 集成

修复了 Brace 匹配代码中的一个问题

改进关键字的 Brace 匹配。新增了多个 BEGIN ... END 结构,以及 DO CASE 内的 CASE 语句和 SWITCH、RECOVER、FINALLY、ELSE、ELSEIF 和 OTHERWISE 语句。

修复在引用已卸载或不可用时添加和删除引用的问题。

VOXPorter

在导出到 XSharp 时,程序现在可以注释、取消注释和删除 VO 代码中的源代码行。
您必须在行尾添加注释。支持以下注释:

         // VXP-COM : comments the line when exporting it
         // VXP-UNC : uncomments the line
         // VXP-DEL : deletes the line contents
 
         示例:
         // METHOD ThisMethodDoesNotGetDefinedInVOcode() // VXP-UNC
         // RETURN NIL // VXP-UNC

 

Changes in 2.0.3.0 (Bandol RC3)

编译器

选择 /vo2 时,STRING 类型的 STATIC LOCALs 的代码生成不会将变量初始化为空字符串。我们还改进了用编译时常数初始化 STATIC LOCAL 时的代码生成。

为了支持通过引用传递给函数/方法的变量,我们现在将在函数/方法结束时将局部变量分配回参数数组。

如果您将一个枚举的值赋值给另一个枚举的变量,编译器不会抱怨。这一问题已得到解决。

添加了对 FoxPro '=' 赋值操作符的支持。其他方言也允许使用赋值操作符,但在其他方言中会产生警告。

无法识别 BEGIN NAMESPACE ... END NAMESPACE 中的 Xbase++ 类。这一问题已得到修复。

WITH 块内的语句不再局限于赋值表达式和方法调用。现在,您可以在 WITH 代码块内的任何地方使用 WITH 语法来表达表达式。如果编译器无法找到 WITH 变量,则会输出一条新的错误信息 (XS9082)

更新了别名表达式规则,以确保复合表达式正确使用括号。

__DEBUG__ 宏并非总是能正确设置。我们更改了设置该宏的算法。当 DEBUG 定义被设置后,该宏就会被定义。 如果设置了 NDEBUG 定义,则没有定义该宏。如果两个定义都不存在,则不设置 __DEBUG__。

编译器允许您在字符串和逻辑类型的变量/表达式之间使用 “+”运算符。现在这已被标记为错误。

宏编译器

修正了在解析与关键字或关键字缩写(如 DATE 和 CODE)相同的字段名以及与内置函数名(如 SET)相同的字段名时出现的问题

修正了一个问题,即使用别名前缀求值的复杂表达式无法正确求值。

宏编译器根据运行时的方言选项进行初始化,以启用/禁用某些行为。

在 FoxPro 方言中运行时,宏编译器现在可以识别用于工作区访问和 memvar 访问的“. ”操作符。

运行时

已添加函数 FieldPutBytes() 和 FieldGetBytes()

添加了函数 ShowArray()

添加了几个缺失的定义,如 MAX_ALLOC 和 ASC_A。

已添加可接受 BYTE[] 参数的 Crypt() 重载

DataObject 类(XPP 方言)的 ClassDescribe() 方法现在包括动态添加的属性和方法。

修正了 MemVars 的 RELEASE 命令的一个问题。这也会释放在当前函数/方法之外定义的变量。

现在,FoxPro 方言与其他方言在 RELEASE 命令的行为上也有区别。
FoxPro 完全删除变量,而其他方言则将变量值设为 NIL。

在 FoxPro 方言中,新的 PRIVATE 内存变量初始化为 FALSE。在其他方言中,它们被初始化为 NIL。

当写入一种类型的数值,而读取时预期是另一种类型的数值时,RuntimeState 中的某些数值属性会出现问题。这一问题已得到修复。

修正了宏编译代码块返回 NIL 值的问题。

DbClearScope() 的参数现在是可选的了

USUAL 类型现在可以在 PTR 和 LONG/INT64 类型的值之间进行比较,PTR 值被转换为相应的整数类型,然后进行整数比较。

USUAL 类型现在还允许在任何类型和 NIL 之间进行比较。

不再检查从 USUAL 值到 SHORT、WORD、BYTE 和 SBYTE 的转换是否与 VO 兼容。

RDD 系统

在 DBFFPT 中添加了对不同块大小的支持。

DBFFPT 现在允许从用户代码中覆盖块大小(创建时)。请注意,块大小小于 32 字节时,FPT 无法在 Visual FoxPro 中打开。

已添加对读取各种 Flexfile 备注字段类型(包括数组)的支持。

已添加对写入 FPT 文件的支持

创建 FPT 文件时,我们现在也会写入 FlexFile 头文件。请注意,我们的 FPT 驱动程序不支持像 FlexFile 那样对删除的块进行 “记录回收”。我们也只支持向 FPT 文件写入 STRING 值和 Byte[] 值。

已添加对使用 COLLATE 选项创建的 Visual FoxPro CDX 文件的支持。RDD dll 现在包含校对和 CodePage 所有可能组合的校对表。

已添加对带有 NIL 值的 USUAL 和比较运算符(>, >=, <, <=)的支持。除了 >= 和 <= 操作符在比较的两边都是 NIL 时返回 TRUE 外,这些操作符都返回 FALSE。

我们公开了多个与 Advantage 相关的函数和类型。此外,我们还定义了 AdsConnect60() 函数。我们没有为 Ace32 和 Ace64 中的所有可用函数创建函数,只创建了 RDD 中需要的函数。

如果您缺少 ACE 类中的某个函数,请告知我们。现在,Ace32 和 Ace64 类或 ACEUNPUB32 或 ACEUNPUB64 类中的所有功能都应可用并可访问。

ADS RDD 返回的逻辑字段值不正确。

修复了 CDX 索引、作用域和过滤器中跳过的一些问题。

对 DBFCDX 执行两次 DbGoTop() 或两次 DbGoBottom() 会混淆 RDD。这一问题已得到修复。

修复了空 DBF 文件中 Seeking() 的一个问题

Advantage RDD 中 STRING 字段的 FieldPut 现在会在赋值前将字段截断到最大长度

修正了 UNIQUE CDX 索引的一个问题。

现在,您可以使用 DBCreate() 创建与 VFP 兼容的 DBF 文件。为此,请使用以下字段类型(除常规 CDLMN 外):

W        Blob
Y        Currency
B        Double
T        DateTime
F        Float
G        General
I        Integer
P        Picture
Q        Varbinary
V        Varchar

特殊字段标志可通过在类型后添加后缀来表示:

"0" = Nullable
"B" = Binary
"+" = AutoIncrement

这样就创建了一个null日期:“D0”,并创建了一个自动递增整数 “I+”。

自动递增列的初始化计数器从 1 开始,步长为 1。 您可以通过调用 DbFieldInfo 来更改:

                 DbFieldInfo(DBS_COUNTER, 1, 100) // 将字段 1 的计数器设置为 100
                       DbFieldInfo(DBS_STEP, 1, 2)          // 将字段 1 的步长设置为 2

修复了在共享模式下打开 FPT 文件时的锁定问题

修复了 DBFCDX RDD 中与 OrderKeyCount() 以及 Scopes 和 SetDeleted() 的各种设置有关的若干问题。

VO SDK 类

修正了 DateTimePicker 类中只分配时间值时的一个问题。

对 System 和 RDD 类进行了一些清理,现在可以在 AnyCPU 模式下编译。这意味着你可以在 64 位程序中使用 DbServer 类!
这两个库的项目也不再启用 “后期绑定 ”编译器选项。这些库中仍有一些后期绑定代码,但这些代码现在使用显式后期绑定调用,如 Send()、IVarGet() 和 IVarPut()。

由于 __DEBUG__ 处理方式的改变,某些 SDK 程序集没有得到更好的优化。

Visual Studio 集成

在编辑器中添加了对 WITH ... END WITH 块的支持

生成本地资源(RC 文件)时,BuildSystem 现在会设置 #define __VERSION__。这将包含 XSharp.Build.DLL 的文件版本号,但不带点。(2.1.0.0 将被写成 “2100”)。

VS 帮助菜单中的 XSharp 帮助项目现在可打开本地帮助 (CHM) 文件

修复了 WCF service 模板中的一个问题

对使用属性的代码的多行缩进进行更正

新事件处理程序的代码生成现在包括 RETURN 语句,即使 VS 没有在语句列表中添加该语句也是如此

已禁用 intellisense 选项 “在每个字符后显示完成列表”,因为它会对性能产生负面影响,而且还会插入前面带有 @@ 字符的关键字。

对 Windows 窗体编辑器的代码分析进行了几处修改。现在,注释和区域以及类的属性都可以保存和重新生成。此外,还修正了项目资源中图像的代码生成,以及同一程序集中声明的静态字段和枚举器的解析。
请注意 :如果使用的值来自与表单定义在同一程序集中的类型,则需要先对程序集进行(重新)编译,然后才能在 Windows 窗体编辑器中成功打开表单。

现在,从 Windows 窗体编辑器生成的新方法将带有结尾 RETURN 语句。

我们对源代码编辑器中 QuickInfo 的显示方式进行了一些改进。

工具

VOXporter 现在也可导出 VERSIONINFO 资源

 

Changes in 2.0.2.0 (Bandol RC 2)

编译器

文件范围的 PUBLIC 声明(用于 MEMVAR)被错误地解析为 GLOBAL。因此,它们被初始化为 NIL,而不是 FALSE。现在它们被正确生成为 public Memvars。memvars 的创建和初始化是在程序集中的 Init3 程序运行后进行的。

实例变量初始化器现在可以引用其他字段,并允许使用 SELF 关键字。但仍不建议这样做。字段初始化的顺序就是它们在源代码中出现的顺序。因此,请确保在代码中以正确的顺序定义字段初始化器。

启用 /vo2 时,AUTO 属性现在也以空字符串初始化。

编译器允许您定义接口的实例变量。这些变量在代码生成过程中被忽略。现在,当编译器检测到接口上的字段时,会产生一条错误信息。

当编译器检测到 2 个类型不同的模糊标识符(例如同名的 LOCAL 和 CLASS)时,错误信息会清楚地显示每个标识符的类型。

修正了预处理器中的一个异常

添加了对 FoxPro 运行时 DLL 的支持(译者注:该 DLL 指 XSharp.VFP.DLL)。

不再支持 ANY 关键字(USUAL 的别名)。

出现在 COLON(“:”)、DOT(“.”)或 ALIAS (->) 操作符之后的关键字不再作为关键字解析,而是作为标识符解析。这将解决访问 DateTime 类的 Date 属性等代码的解析问题。

我们增加了对 WITH .. END WITH 语句块的支持:
 
LOCAL oPerson as Person
oPerson := Person{}
WITH oPerson
  :FirstName := "John"
  :LastName := "Doe"
  :Speak()
END WITH
您也可以使用 DOT (.) 作为名称的前缀。WITH ... ENDWITH 中唯一允许使用的表达式是赋值和方法调用(如上所示)

已添加对 FoxPro LPARAMETERS 语句的支持。请注意,函数或过程只能有 PARAMETERS 关键字或 LPARAMETERS 关键字或已声明的参数(名称位于 FUNCTION/PROCEDURE 行的括号之间)

已添加对 FoxPro THIS 关键字和 .NULL. 关键字

我们新增了对 FoxPro 日期字面格式 {^2019-06-21} 和 FoxPro 日期时间字面格式 {^2019-06-21 23:59:59} 的支持。

Core 方言现在也支持日期字面量和 DateTime 字面量。在 Core 方言中,日期字面量将表示为 DateTime 值。

标准头文件 xsharpdefs.xh 现在有条件地包含了 Xbase++ 方言和 FoxPro 方言的头文件。这些头文件目前没有太多内容,但在未来几个月内会有所改变。

如果编译器检测到包含了某些头文件,但这些头文件中的定义在引用程序集中也可以作为常量使用,那么编译器就会发出警告,并跳过包含文件 (XS9081)

编译器现在支持隐式函数 _ARGS()。它将被解析为参数数组,通过 clipper 调用约定传递给函数/方法。这可用于将一个函数/方法的所有参数传递给另一个函数/方法。

我们为 FoxPro 方言添加了 TEXT ... ENDTEXT 命令。TEXT 和 ENDTEXT 行之间的字符串将被传递到一个特殊的运行时函数 __TextSupport 中,该函数将接收 5 个参数:string、merge、NoShow、Flags 和 Pretext 参数。目前,您必须自己定义该函数。

我们为所有还没有结尾关键字的实体类型添加了结尾关键字支持。新的结束关键字是可选的。它们列于下表。FoxPro ENDPROC 和 ENDFUNC 关键字将通过 UDC 映射到 END PROCEDURE 和 END FUNCTION。

开始

结束

PROCEDURE

END PROCEDURE

PROC

END PROC

FUNCTION

END FUNCTION

FUNC

END FUNC

METHOD

END METHOD

ASSIGN

END ASSIGN

ACCESS

END ACCESS

VOSTRUCT

END VOSTRUCT

UNION

END UNION

编译器现在会在 RuntimeState 的 Dialect 属性中注册 main 的方言(仅限非 Core 方言)

宏编译器

修正了转义字面字符串的一个问题

修正了隐式收缩转换的一个问题

修正了宏编译别名操作 (Customer)->&fieldName 的一个问题

运行时

修正了 Round() 函数中的一个问题。

修正了 ExecName() 函数中的一个问题。

已添加 FoxPro 运行时 DLL。

在 Xbase++ 方言运行时添加了 XML 支持功能

在 Xbase++ 方言运行时添加了对动态类创建的支持。

修正了 Push-Pop 工作区代码中的别名表达式问题。

将 NULL 转换为符号会导致异常。这一问题已得到修复。

RDD 系统

修复了 ADS RDD 中的几个问题

现在包含 DBFCDX RDD

现在包含 DBFVFP RDD。该 RDD 可用于访问具有 DBF/FPT/CDX 扩展名的文件,并支持 Visual Foxpro 字段类型,如 Integer、Double、日期时间和 VarChar。读取文件应完全支持。除 Picture 和 General 格式以及自增整数字段外,写入文件也应正常工作。您还可以使用 RDD 打开 VFP 的各种 “定义”文件,如项目、表单和报表。RDD “了解 ”索引和备忘录的不同扩展名。您还可以将 DBC 文件作为普通表打开。在未来版本中,我们将支持 VFP 数据库功能。

Visual Studio 集成

现在,您可以指定多行语句应在第二行及以后各行缩进。

BEGIN NAMESPACE ... END NAMESPACE 中函数的类型查找不包括该命名空间中的类型。

为 Xbase++ 方言中的 INLINE 方法启动 intellisense 功能

修正了 intellisense 中的几个问题

改进了 FOREACH 循环中声明的 VAR 关键字的 intellisense 功能

其他几项(较小的)改进。

工具

VOXporter 现在会在 RC 文件中写入 DEFINES,而不再是字面值。

VOXporter:修正文件名中包含无效字符的模块名称

 


 

Changes in 2.0.1.0 (Bandol RC 1)

编译器

添加了对所谓 IF 模式表达式语法的支持,该语法由 IS 测试和变量赋值组成,前缀为 VAR 关键字:
IF x is Foo VAR oFoo
  ? oFoo:DoSomething()
ENDIF
 
表达式中引入的变量 oFoo 只在 IF 语句中可见。
当然,您也可以在其他地方使用该模式,如 ELSEIF 块、CASE 语句、WHILE 表达式等:
 
IF x is Foo VAR oFoo
  ? oFoo:DoSomething()
ELSEIF x is Bar VAR oBar
  ? oBar:DoSomethingElse()
ENDIF
 

修正了方法修饰符和泛型方法的一个问题

修正了分部类的大小写和析构函数不同的问题

修正了使用 CLIPPER 调用约定的接口和方法的一个问题

当 ACCESS 或 ASSIGN 方法包含类型参数和/或约束子句时,编译器现在会生成错误 (9077)

修正了带有特定二进制数值的 DEFINE 的问题。此外,在计算 DEFINE 值的数字运算结果时,现在总是进行溢出检查。

当常量值与小于 32 位的数值相加或相减时,编译器会将结果视为 32 位。这有时会迫使你在代码中使用转置。有了这一变化,就不再需要这种转换了。

编译器允许您连接非字符串值和字符串,并自动在非字符串上调用 ToString()。现在已不再可能。现在,编译器在检测到这种情况时会生成一个错误 (9078)。

我们已在编译器中添加了错误捕获代码,该代码应将内部错误导向编译器错误 XS9999.如果您发现此类错误,请通知我们。

字面字符串的 DIM 数组现在可以正确初始化。

使用共享编译器在不同方言之间切换时存在一个问题。它有时不再能检测到特定方言的关键字。这一问题已得到修复。

修正了一个问题,在该问题中,不正确的代码会产生错误 “Failure to emit assembly”。

修正了代码中使用 _CAST 将 32 位值转换为 16 位值的问题

修正了重载索引属性的一个问题,即子类中的索引参数与超类中的索引参数类型不同。

更改了若干别名操作的实现(ALIAS->FIELD 和 (ALIAS)->(Expression))

更改了扩展字符串的预处理器处理 ( (<token>) )

Roslyn 代码没有将某些变量标记为 “已赋值但未读取”,以便与旧的 C# 编译器兼容。现在,我们将这些赋值标记为警告。这可能会在您的代码中产生许多以前未检测到的警告。
为了支持这一点,我们收到了一些请求,希望在编译器中 “开放” 对基于 1 的索引的支持。过去,编译器只允许对 System.Array 类型或 XBase ARRAY 类型的变量进行基于 1 的索引。
我们现在为运行时添加了几个接口。如果你的类型实现了这些接口之一,那么编译器将识别这一点,并允许你在代码中使用基于 1 的索引,然后编译器将自动从数字索引参数中减去 1。XSharp ARRAY 类型和 ARRAY OF 类型现在也实现了这些接口(之一)。
这些接口是:
  INTERFACE IIndexer
      PUBLIC PROPERTY SELF[index PARAMS INT[]] AS USUAL GET SET
  END INTERFACE
 
  INTERFACE IIndexedProperties
      PROPERTY SELF[index AS INT   ] AS USUAL GET SET
      PROPERTY SELF[name AS STRING] AS USUAL GET SET
  END INTERFACE
  INTERFACE INamedIndexer
    PUBLIC PROPERTY SELF[index AS INT, name AS STRING] AS USUAL GET SET
  END INTERFACE

运行时

修正了 OrderInfo() 函数中的一些问题

修正了运行时中 DB..() 函数的几个问题

修正了宏编译器的几个问题

修正了在对方法的后期绑定调用中处理默认参数的问题

改进了后期绑定代码中缺少方法和/或属性时的错误信息。

Select() 函数会更改当前工作区。现已修复。

将 USUAL 转换为 STRING 不会像 VO 那样抛出相同的异常。它总是在 USUAL 上调用 ToString()。现在的行为与 VO 相同。

F_ERROR 现在已被定义为 PTR,而不再是数值

CreateInstance 现在还能查找命名空间中定义的类

修复在后期绑定代码中丢失参数的问题。还添加了对在后期绑定代码中调用重载方法和构造函数的(有限)支持。

修正了 TransForm() 和几个 Str() 函数的问题。

XSharp.Core 现在已完全编译为安全代码。

修正了一个关于后期绑定 assigns 和 access 的问题

NIL<-> STRING 比较现在与 Visual Objects 兼容

修正了 AEval() 和参数缺失的问题

已添加 Set() 函数。使用 _SET 定义的头文件时请注意。Harbour、Xbase++ 和 VO/Vulcan 中的定义存在细微差别。
我们建议不要使用头文件中的定义,而是使用 X# 运行时 DLL 中定义的定义

更改了编译器用于别名操作的函数的实现方式

RDD 系统

已添加对 DBF character 字段的支持,最大可达 64K。

实施 DBFCDX RDD

修复了几个与 DBFNTX RDD 有关的问题

DBF RDD 对 Ansi DBF 文件使用了不正确的锁定方案。现在它使用与 VO 和 Vulcan 相同的方案。

宏编译索引表达式不属于 _CodeBlock 类型,也不属于 RuntimeCodeBlock 类型(RuntimeCodeblock 被封装在 _CodeBlock 对象内)。
这样,在将这些表达式存储到 USUAL

Visual Studio 集成

修正了键入 VAR 表达式时可能出现的异常

在项目系统备份项目文件时,我们会确保在写入或删除现有文件前清除只读标记。

从 C++ 项目读取 intellisense 数据可能会使 intellisense 引擎陷入无限循环。这一问题已得到修复。

现在,对 Form.Designer.prg 的更改会立即写入磁盘,以确保在窗体编辑器窗口中按下 “运行” 或 “调试” 键时,窗体的更改会被重新编译。

改进了对 VAR 关键字的 intellisense 支持。

在 “项目属性 ”页面上添加了对 FoxPro 的支持,以便为 FoxPro 的编译器和运行时更改做好准备。

.CH 文件现在也能在 Visual Studio 中被识别为 “X#”文件。

现在,您可以控制从 “完成列表 ”中选择条目的字符。例如,DOT(.) 和 COLON(:) 现在也可以选择当前选定的元素。完整列表请参见工具-选项-文本编辑器-XSharp-Intellisense 页面。

添加到项目中的程序集在下一次加载项目时才会被正确解析。这一问题已得到修复。

修复了为 Windows 表单编辑器提供数据的 codedom 分析器中的一个问题。现在可以从同一程序集中的另一个窗体继承窗体。当然,您必须先编译项目。

现在,.CH 扩展名也注册为 X# 项目系统的相关扩展名。

更改了 #ifdef 命令的自动缩进

修正了在加载带有 COM 引用的项目文件时可能出现的异常。

已为 XPP 和 VO Dialect 中的类库添加模板

有时会在注释区域内触发 intellisense 的类型查找。这一问题已得到修复。

工具

VOXPorter 在创建委托时未移除调用约定。现已修复

VOXporter 有时会生成包含大量重复资源项目的项目文件。这一问题已得到修复。

VOXporter 现在会用“@@”标记与某个新关键字冲突的前缀标识符。

缩短了 VOXporter 欢迎屏幕的延迟时间。


 

Changes in 2.0.0.9 (Bandol Beta 9)

编译器

Lexer(编译器中识别关键字和文字等的部分)已重写,速度略有加快。

编译器现在支持数字字面的数字分隔符。因此,您现在可以将 100 万写成
1_000_000

修正了一个问题,即即使选择了编译器选项 -vo2,静态局部变量也不会以 "" 初始化

使用预处理器宏(如 __XSHARP_RT__ )的 #ifdef 命令无法正常工作。

Xbase++ 方言现在也支持 “普通 ”类语法。

我们在 Beta 8 中更改了 “入口点 ”算法。现在已经恢复,而且 -main 命令行选项现在也能再次使用。Start方法的 “主体 ”现在封装在一个匿名函数中。

重复的包含文件不再产生错误,而是发出警告

修复默认参数值后缀为 “L ”或 “U ”的问题

为使用 clipper 调用约定的方法/函数指定默认参数值时添加了编译器错误

当指定 -vo2 时,STRING 的 DIM 数组未用 "" 初始化。该问题已得到修复。

新增了对 Dbase 风格内存变量(MEMVAR、PUBLIC、PRIVATE、PARAMETERS)的支持。更多信息,请参阅帮助文件中的 MEMVAR 这仅适用于某些方言,还需要使用 /memvar 命令行选项

新增了对未声明变量的支持(不建议使用!)。这仅适用于某些方言,需要使用 /memvar/undeclared 命令行选项

修正了 USUAL 变量和 STRING 变量之间的比较问题

修正了分部类的一个问题,在不同的声明中,类名的大小写不同

修正了带有 L 或 U 后缀的数字默认参数的一个问题

修正了多行注释样式下单行注释后的续行符(分号)问题。

修正了包含 YIELD 句的方法与编译器选项 /vo9 结合使用时的问题

当泛型方法上缺少可见性修饰符时,该方法会被创建为 private 方法。这一问题已得到修复。

在 XSharp.RT 和 XSharp.Core 中的重载函数之间进行选择时,有时会选择 XSharp.RT 程序集中的函数,尽管 XSharp.Core 中的重载效果更好

如果 CASE 语句中没有 CASE 块,只有一个 OTHERWISE 块,编译器就会崩溃。该问题已得到修复,并添加了关于空 CASE 语句的警告。

运行时

对宏编译器进行了多项修改,如十六进制字面的解析、参数的大小写敏感性(不再区分大小写)以及对函数重载的有限支持。

添加了几个缺失的函数,如 _Quit()、

几个 Ord..() 函数的返回值不正确。现已修复。

修正了驱动器根目录 CurDir() 的一个问题

修正了在调用 Send() 时单个参数值为 NULL_OBJECT 的问题。

解决了 DiskFree() 和 DiskSpace() 参数不正确的问题

MemoRead() 和 MemoWrit() 以及 FRead...() 和 FWrite...() 现在与 VO Runtime 中的函数一样尊重 SetAnsi() 设置。

我们新增了 2 个用于读/写二进制文件的函数: MemoReadBinary() 和 MemoWritBinary()

并非所有 DBOI_ enum 值都与 Vulcan 中的值相同。这个问题已经解决。

SetDecimalSep() 和 SetThousandSep() 现在还能设置当前文化中的数字分隔符。

USUAL -> STRING 转换现在调用 AsString()

新增了对 Dbase 风格动态内存变量(MEMVAR、PUBLIC、PRIVATE、PARAMETERS)的支持。更多信息,请参阅帮助文件中的 内存变量

对于 DateTIme 类型的 USUAL,IsDate() 函数现在也返回 TRUE。另外还有一个单独的 IsDateTime() 函数。我们还添加了 IsFractional()(FLOAT 或 DECIMAL)和 IsInteger(LONG 或 INT64)以及 IsInt64()。

在 Error 类中添加了缺失的 Cargo slot。同时改进了 Error:ToString() 方法。

修复 W2String() 中的问题

还有更多微小的变化。

Visual Studio 集成

我们在 “项目属性” 对话框中添加了一个新的标签页: 方言。其中包含特定方言的语言选项。

将 “生成”选项页面(与配置相关)中的 2 个选项移至 “语言”页面(与生成无关),因为这样更合理:

Include Path

NoStdDef

我们还在语言页面上添加了一个项目属性,用于指定其他标准头文件(而不是 XSharpDefs.xh)。

在 intellisense 中显示的 XSharp.__Array 类型的名称是错误的

我们在 “项目属性 ”对话页面上添加了条目,以启用 MEMVAR 支持和启用未声明变量

修正了 CodeDom 提供程序(Windows 窗体编辑器使用)中的一个问题,即在写回源代码时,带有数组类型的字段会丢失数组括号。

从窗口窗体编辑器写入更改时,我们不再写入磁盘,而是写入打开的(有时是不可见的).designer.prg 窗口。这样就可以避免在 Visual Studio 外部更改 .designer.prg 文件时出现警告信息。

修正了源代码解析中标识符名称以“@@”开头的问题

调试器将 UINT64 显示为 ARRAY 的类型名。现已修复。

在 Windows 窗体编辑器中重新命名窗体时,对带有单独 .designer.prg 的窗体不起作用。这一问题已得到修复。

修正了一个(非常老的)问题,即 xsproj 文件中的 OutPutPath 属性有时会设置为 $(OutputPath)。

修正了编辑器中出现的空源文件或头文件异常。

修正了为无错误代码的错误创建错误列表时出现的异常

在编辑器中注释单行时,现在将始终使用 // 注释格式

工具

本版本无任何更改。


 

Changes in 2.0.0.8 (Bandol Beta 8)

编译器

编译器源代码已升级到Roslyn 2.10(C# 7.3)。因此,出现了一些新的编译器选项,比如 /refout,并且我们还支持"PRIVATE PROTECTED"修饰符的组合,该修饰符将类型成员定义为对同一程序集中的子类可访问,但对其他程序集中的子类不可访问。

我们添加了对 Xbase++ 类声明的支持。请参阅 Xbase++ 类声明主题,了解有关语法、支持和不支持的更多信息。

我们增加了对使用 &Identifier 语法的简单宏的支持

我们增加了对后期绑定属性访问的支持:

o<Expression>:&<Identifier> 语法。
这相当于 IVarGet(<Expression>,<Identifier>)。

o<Expression>:&(<Expression2>) 语法。
这相当于 IVarGet(<Expression>,<Expression2>)。

o这两者也可用于赋值,并将被翻译为 IVarPut:
<Expression>:&<Identifier> := <Value>
这就变成了 IVarPut(<Expression>,<Identifier>,<Value>)。

o即使未启用 “延迟绑定”,所有这些功能也能正常工作。

我们添加了一个新的编译器选项 /stddefs,允许您更改标准头文件(默认为 XSharpDefs.xh)。

我们添加了一个新的预处理器匹配标记 <#idMarker>,它可以匹配单个标记(第一个空格符之前的所有字符)

现在选择一种方言后,编译器将自动添加一些编译器宏。VO 方言声明了__VO__宏,Vulcan 方言声明了__VULCAN__宏,harbour 方言声明了__HARBOUR__宏,Xbase++ 方言声明了__XPP__宏。

根据 X# 运行时编译时,也将定义__XSHARP_RT__宏。

我们添加了一个新的警告,当您将一个不带 “ref ”修饰符(或 @ 前缀)的参数传递给一个方法或函数时,该方法或函数希望该参数为引用参数或 out 参数。

我们还添加了一个警告,当您从较大的 integral 类型赋值到较小的 integral 类型时,该警告将显示,以提醒您注意可能出现的溢出问题。

运行时

此版本包含一个新的更快的宏编译器。它应与 VO 宏编译器完全兼容。宏编译器尚未提供某些 .Net 功能。

我们将大部分通用 XBase 代码移到了 XSharp.RT.DLL 中。XSharp.VO.DLL 现在只包含 VO 专用代码。我们还为 XPP 添加了 XSharp.XPP.DLL

修复与 FRead3()、FWrite3() 和 FReadStr 有关的 Ansi2OEM 问题

添加了丢失的函数 EnableLBOptimizations() 和属性 Array:Count

修复了使用 CodeBlock 值进行延迟绑定分配的问题。

修正了 AScan() 和 AEval() 参数缺失的问题

更改了 DirChange()、DirMake() 和 DirRemove() 的错误返回代码

Send() 会 “吞下 ”错误。现已修复

修正了为多维数组赋值的问题

修正了使用 CreateInstance() 创建对象时,对象不在 “global”命名空间中的问题

修复了 RDD 系统和支持函数中的若干问题。

修正了后期绑定支持中的几个问题,如 IsMethod、IsAccess、IVarPut、IVarPutSelf 等。

修正了 TransForm() 的几个问题

现在,对包含整数的常项进行整除时,根据主程序的编译器设置,要么返回整数,要么返回小数。

我们修复了后期绑定调用中的几个转换问题

我们更正了 Val() 和 Str() 函数的几个问题。

DATE 和 FLOAT 的内部类型名称已改为 __Date 和 __Float。如果您依赖这些类型名称,请检查您的代码!

如果运行时以发布模式编译,DebOut32 无法向调试终端输出数据。这一问题已得到修复。

Visual Studio 集成

修正了错误列表中 “当前项目” 的过滤问题

局部变量的类型查找有时会失败。现已修复

修正了可能在 VS 中导致异常的括号匹配问题

修正了工具提示在 VS 中可能导致异常的问题

修正了在 VS 中取消注释可能导致异常的问题

在 VS 中添加的新引用并不总是包含在编辑器的类型搜索中。这一问题已得到修复。

构造函数的成员原型现在包括类型名称和大括号

我们已着手改进用 VAR 声明的变量的代码自动补全功能。

我们已开始支持泛型类型成员的代码自动补全。这项工作尚未完成。

不属于 X# 项目也不属于 Vulcan 项目的 PRG 文件现在也会在编辑器中着色。

工具

VulcanXPorter 总是调整引用的 VO 库,并忽略 “使用 X# 运行时 ”复选框

VOXPorter 现在有一个选项,可将 AEF 文件中引用的资源复制到项目的资源子文件夹中

VOXPorter 现在还会将 cavowed、cavofed 和 cavoded 模板文件复制到项目的属性文件夹中。


 

Changes in 2.0.0.7 (Bandol Beta 7)

编译器

在调用带有 USUAL 参数的运行时函数时,编译器现在会自动优先选择带有 “传统 ”VO 类型的方法或函数,而不是带有增强 .Net 类型的方法或函数。例如,如果有两个重载,一个接收 byte[],另一个接收字符串,那么接收字符串的重载将优先于接收 byte[] 的重载。

解决了 IIF() 表达式中的 .NOT. 表达式问题

改进了调用表达式(如 String.Compare())的调试器断点生成功能

修正了 #define 中定义的宏参数的预处理器错误。现在这些参数必须有正确的大小写。不同大小写的参数将不再被解析。

修正了一个预处理器错误,该错误导致预处理器规则中的可选匹配模式重复出现。这个问题太复杂,无法在此详细解释 <g>。

编译器为数组操作生成的代码现在使用 X# 运行时声明的新接口(见下文)。

运行时

我们添加了几个缺失的函数,如 _GetCmdLine、Oem2AnsiA() 和 XSharpLoadLibrary。

修复了 CreateInstance、IVarGet、IVarPut()、CtoDAnsi() 等程序中的问题。

为 FRead4() 添加了 VO 兼容重载

不再为空日期生成异常

Ferror() 并不总是返回文件操作的错误信息。现已修复

我们添加了一个新的 FException() 函数,该函数可返回低级文件操作中发生的最后一次异常

现在支持将包含 PTR 的 usual 转换为 LONG 或 DWORD

新增了一些与数组处理相关的接口。编译器不再在代码中插入对 Array 的转换,而是根据索引参数的类型插入对这些接口之一的转换。USUAL 类型实现了 IIndexer 和 IIndexProperties,当该对象公开接口时,会将调用派发到通常的对象内部。在对 ARRAY OF <type> 使用 AEval 或 AScan 时,可使用这种方法对属性进行索引访问。

oXSharp.IIndexer

oXSharp.INamedIndexer        

oXSharp.IIndexedProperties
 

SDK 类

我们添加了来自 Paul Piko 的混合用户界面类(经 Paul 许可)

工具

Vulcan XPorter 现在还有一个选项,可将运行时和 SDK 引用替换为 X# 运行时引用


 

Changes in 2.0.0.6 (Bandol Beta 6)

编译器

编译器有时仍会对编译器生成的未使用变量发出警告。这一问题已得到修复。

编译器现在会发出尚未支持 #pragmas 的警告 (9006)

添加了编译器宏 __FUNCTION__ ,它以原始格式返回当前函数/方法的名称。

在 Core 方言中编译时,多维数组的字面子数组不再需要类型前缀

修复了生成运行时程序集时出现的全局类名问题(这些程序集对全局类名有特殊约定)

当接口中方法的调用约定与实现的调用约定(CLIPPER 与非 CLIPPER)不同时,编译器将产生一个新的错误 (9067)。

_DLL 函数和过程的调用约定现在是可选的,默认为 PASCAL (stdcall)

using 语句的命名空间别名并非在所有情况下都有效。

现在,编译器会对错误使用 VIRTUAL 和 OVERRIDE 修饰符的代码生成错误。

编译器曾因带有泛型参数的特定类型的不正确局部变量初始化器而抛出异常。现已修复。

属性的 GET 或 SET 访问器上的可见性修饰符无法正常工作(INTERNAL、PRIVATE 等)。现已修复。

编译器现在会以不同的方式处理 PSZ(_CAST,...) 和 PSZ(...)。当参数为字面字符串时,PSZ 只分配一次,并存储在程序集的 “PSZ 表 ”中。这个 PSZ 的生命周期就是应用程序的生命周期。出现这种情况时,将显示新的编译器警告 XS9068
当参数是存储在局部或全局(或定义)中的字符串时,编译器无法知道 PSZ 的寿命。因此,编译器会使用 StringAlloc() 函数为 PSZ 分配内存。这样可以确保 PSZ 不会超出范围并被释放。如果您在应用程序中经常使用该函数,那么您可能会重复分配内存。我们建议您避免对 PSZ 使用施用和转换操作符,并通过手动分配和释放 PSZ 来控制 PSZ 变量的生命周期。对非字符串(数值或指针)进行 PSZ 转换时,只需调用 PSZ 构造函数,该构造函数将接收一个 intptr(Win32API 库中有多处使用此函数来处理 “特殊 ”PSZ 值)。

Vulcan 方言现在也支持命名参数。如果您的代码看起来像下面的代码,这可能会导致编译器错误,因为编译器会认为 aValue 是 Empty() 函数的命名参数。
 
IF Empty(aValue := SomeExpression())
 

如果从另一个类继承静态类,以前会收到编译器警告。现在则会出现编译器错误,因为这会产生一个副作用,即生成的程序集包含一个已损坏的引用。

重载解析代码现在会选择类型方法/函数,而不是采用 clipper 调用约定的方法/函数。

编译器现在可以识别 Xbase++ 方言。目前它的行为与 Harbour 相同。我们还添加了编译器宏 __DIALECT_XBASEPP__ ,当以 Xbase++ 模式编译时,该宏将自动定义为 TRUE。

修正了 PDB 行号生成中的一个问题,该问题会导致调试器中出现不正确的行号

Visual Studio 集成

对于在 #include 文件中定义的 #defines,源代码编辑器并不总是显示正确的 “活动 ”区域。

打开不含实体的源文件(如头文件)可能会在 VS 内出现错误信息。

修正了编辑器中的 null 引用异常

修正了在编辑器中取消代码注释时出现的问题

改进了具有许多依赖关系的大型解决方案的加载时间性能。

修正了 intellisense 引擎可能锁定项目引用或程序集引用使用的 DLL 的问题。

修正了一个问题,即在 windows 窗体编辑器中打开窗体时,缺少引用(例如未在开发人员机器上安装的 COM 引用)可能会导致类型查找问题。

在项目属性页面添加了选择 Harbour 方言的选项。

生成系统

生成系统无法识别源代码中已注释的 NAMESPACE 开头行。现已修复。

VOXporter

我们在输出文件中添加了按字母顺序排列实体的选项。

我们添加了一个选项,您可以选择将 X# 运行时作为引用添加到您的应用程序中(否则将使用 Vulcan 运行时)。

运行时

调用 SetInternational(#Windows) 后,SetCentury 设置不正确。现已修复。

日期的 Descend 函数现在会返回一个数字,就像在 VO

函数 ChrA 和 AscA 已更名为 Chr() 和 Asc(),并删除了原来的函数 Chr() 和 Asc()。原来的函数使用的是 DOS (Oem) 代码,与 Visual Objects 不兼容。

运行时有几处使用 System.Encoding.Default 代码页将字符从 8 位转换为 16 位。这一点已经改变。现在我们使用与运行时状态中 WinCodePage 相匹配的代码页。因此,通过在运行时状态中设置 Windows 代码页,现在还可以控制从 Unicode 到 Ansi 再到 Unicode 的转换。

某些低级文件功能的 Oem2Ansi 转换不正确。

我们在后期绑定支持方面做了一些调整

所有字符串 - PSZ 例程(String2PSz()、StringAlloc() 等)现在都使用 Windows Codepage 将 unicode 字符串转换为 ansi。

如果您的程序库在编译时使用了 “兼容字符串比较”,但主应用程序没有使用,那么程序库中的字符串比较将遵循与主应用程序相同的规则,因为主应用程序在运行时注册了 /vo13 设置。运行时中的 “兼容 ”字符串比较例程现在会检测到主程序不想进行 VO 兼容字符串比较,并将简单地调用正常的 .Net 比较例程。
因此,我们建议第三方产品在其代码中始终使用兼容字符串比较。

根据源代码注释生成了运行时的初步文档,并将其作为本文档的一个章节。

VO SDK

该版本包含根据 X# 运行时编译的第一版 VO SDK。我们包含了以下类库

oWin32API

oSystem Classes

oRDD Classes

oSQL Classes

oGUI Classes

oInternet Classes

oConsole Classes

oReport Classes

所有程序集都以 VO<Name>.DLL 命名,这些程序集中的类都在 VO 命名空间中。

本 SDK 基于 VO 2.8 SP3 源代码。VO 2.8 SP3 和 VO 2.8 SP4 之间的差异稍后将合并到源代码中、

不包括 OLE、OleServer 和 Internet Server 库。XSharp.VO 库中包含 OleAutoObject 类及其支持类。不包括 OleControl 和 OleObject。

这些类的初步文档是根据源代码注释生成的,已作为章节纳入本文档。

RDD 系统

此版本包含 RDD 系统的第一个版本。DBF-DBT 已准备就绪。其他 RDD 将在后续版本中陆续推出。此外,大部分与 RDD 相关的功能也已在此版本中运行。

该版本还包含 Advantage RDD 的第一个版本。使用该 RDD,您可以访问 DBF/DBT/NTX 文件、DBF/FPT/CDX 文件和 ADT/ADM/ADI 文件。RDD 名称与 Vulcan 的 RDD 名称相同。(AXDBFCDX、AXDBFNTX、ADSADT)。我们还支持 AXDBFVFP 格式和 AXSQLCDX、AXSQLNTX、AXSQLVFP。有关这些 RDD 的差异和可能性的更多信息,请参阅 Advantage 文档。
我们在 Advantage 客户端引擎的基础上对 Advantage RDD 进行了编码。我们的 RDD 系统会检测您是在 x86 还是 x64 模式下运行,并相应地调用 Ace32 或 Ace64 中的函数。
要使用 Advantage,您需要将支持 DLL 从 Advantage Vulcan RDD 复制到您应用程序的文件夹中。请查看 Vulcan 的 Advantage 文档,查看 DLL 列表。Advantage RDD 是标准 XSharp.RDD.DLL 的一部分,因此取代了 Vulcan 的 AdvantageRDD.Dll。

XSharp.Core DLL 现在也支持 RDD。我们选择不在函数中实现,而是在 CoreDb 类中作为静态方法实现。使用 VoDb..() 函数的旧代码可以通过将 “VoDb ”更改为 “CoreDb ”来移植。
在 VO 和 Vulcan 中作为 USUAL 的参数和返回值在 CoreDb 类中作为 OBJECT 实现。
..Info() 方法有两个重载。一个重载Object,一个重载Object引用。
CoreDb 中的方法用逻辑值返回成功或失败,就像 VO 中的 VODB..() 函数一样。如果您想知道上次操作过程中发生了什么错误,可以使用 CoreDb._ErrInfoPtr() 方法进行访问。该方法返回 RDD 操作中发生的最后一次异常。

目前,CoreDb 类只有返回对象的 FieldGet()。我们将在下一次生成中添加一些以指定类型返回值的额外方法(如 FieldGetString()、FieldGetBytes() 等)。我们还将为 FieldPut() 添加可接受不同参数类型的重载。

XSharp.VO DLL 具有 VoDb..() 函数和 DbAppend()、EOF()、DbSkip() 等高级函数。
VoDb..() 函数用逻辑值返回成功或失败。如果您想知道最后一次操作的错误信息,可以使用 _VoDbErrInfoPtr() 方法进行访问。该方法返回 RDD 操作中发生的最后一次异常。

您可以混合调用 VoDb..() 函数和 CoreDb..() 方法。在引擎下,VoDb...() 函数也会调用 CoreDb 方法。

高级函数可能会像在 VO 中一样抛出异常。例如,在没有打开表的工作区中调用这些函数时。有些函数会简单地返回空值(如 Dbf()、Recno())。其他函数则会抛出异常。如果使用 ErrorBlock() 注册了错误处理程序,那么该错误处理程序将被错误对象调用。否则系统将抛出异常。

RDD 系统通过 DbDate 结构返回日期值,通过 DbFloat 结构返回浮点值。这些结构没有隐式转换方法。 不过,它们确实实现了 IDate 和 IFloat,而且当它们存储在 XSharp.VO DLL 内的 USUAL 中时,可以并将被转换为 Date 和 Float 类型。DbDate 结构是年、月和日期的简单组合。DbFloat 结构用于保存 Real8 中的字段值以及长度和小数位数。

有关 RDD 系统的更多文档将在稍后发布。当然,您也可以查看 GitHub 上的帮助文件和源代码。

 

Changes in 2.0.0.5 (Bandol Beta 5)

编译器

使用本地资源的程序集的强命名密钥无效。现已修复

当同一源代码(PRG)文件包含两次包含文件时,就会产生大量编译器警告,提示重复的 #defines。特别是当 Vulcan VOWin32APILibrary.vh 被包含两次时,每个源文件将产生超过 15000 个编译器警告。大量的警告会导致编译器占用过多内存。现在,当我们检测到同一文件被包含两次时,就会输出编译错误。我们还为每个源 (PRG) 文件添加了 500 个预处理器错误的限制。

Beta 4 中的一项更改可能会导致编译器对 X# 编译器自动引入的未使用变量发出警告。这种警告将不再生成。

现在,编译器可以正确地将某些编译器选项存储到 XSharp 的运行时状态中。

运行时

修复了 Ansi2OEM 和 OEM2Ansi 功能中的一个问题。

修正了 SetCollation(#Windows) 排序中的一个问题

修正了 ASort() 等运行时函数中的字符串比较问题。现在,它还尊重新的运行时属性 CompilerOptionVO13,以控制排序

Visual Studio 集成

编辑器成员下拉菜单中的成员排序是根据方法名和属性名进行的,不包括类型名。当源文件包含多个类型时,成员下拉菜单中的成员将混合排序

生成系统

VO15 的默认值已从 false 改回未定义。


 

Changes in 2.0.0.4 (Bandol Beta 4)

编译器

可能的突破性改变:函数现在总是优先于同名方法。如果要调用同一类中的方法,需要在方法前加上类型名(静态方法)或 SELF: 前缀。如果没有冲突的函数名,则仍可使用方法名调用该方法。我们建议在方法调用前加上前缀,以便代码更易于阅读。

编译器只接受一个标识符,没有 INSTANCE、EXPORT 或其他前缀,也没有类声明中的类型。编译器会创建一个 USUAL 类型的公共字段。现在已经不可能了。

改进了位置关键字检测算法(这也会影响源代码编辑器)

操作符 || 现在映射到逻辑或 (a .OR. b) 而不是二进制或 (_OR(a,b))

VAR 语句现在也能正确解析
 
VAR x = SomeFunction()
 

编译时会警告您应该使用赋值运算符 (:=) 。
我们之所以添加这一功能,是因为许多人(包括我们自己)从 VB 和 C# 中复制了操作符为单个等号的示例。

有关冲突类型的错误信息现在包括完全合格的类型名称。

编译器不再包含字面浮点运算的宽度。这与 VO 兼容。

现在允许使用枚举类型的默认参数。

运行时

添加了几个缺失的函数,如 __Str() 和 DoEvents()

修正了宏编译器在处理非英语语言时出现的问题。

为 Is...()函数添加了几个重载,这些函数使用 PSZ 而不是字符串,例如 IsAlpha() 和 IsUpper()。

添加了一些缺失的错误定义,如 E_DEFAULT 和 E_RETRY。

修复 SubStr() 和负参数的问题

修复 IsInstanceOf() 的一个问题

修复 Val() 和包含 “E ”字符的十六进制值之间的问题

添加了从 ARRAY 到 OBJECT[] 的隐式转换,并返回了隐式转换。

对 Transform() 和 Unformat() 的代码进行了几处修改,以涵盖多种外来图片格式

修改 SetCentury() 的代码,使其也能自动调整日期格式(SetDateFormat())

结合 SetFixed() 和 SetDigitFixed(),修复 Str() 系列函数。

Visual Studio 集成

修正了在 Visual Studio 最新版本中生成项目时出现的问题

有几个 “关键字” 以前没有同步大小写,如 TRUE、FALSE、NULL_STRING 等、

只要用户将光标放在关键字上或紧随其后,当前行中的关键字就不会大小写同步。这意味着,当您键入 String 并希望继续将其改为 StringComparer 时,格式器将不再启动,并在您有机会完成单词之前将 “String ”改为关键字的大小写。

表单编辑器内的控制命令对话框没有保存更改。

在编辑器右侧下拉菜单中添加了一个选项,可选择包含编辑器中的所有实体,或仅包含当前选定类型中的成员

编辑器也会匹配字面字符串和注释中的大括号。现已修复。

修正了 CodeDom 解析器的一个问题,即扩展字符串(包含 CRLF 符号或其他特殊符号的字符串)的解析不正确。这导致 windows 窗体编辑器出现问题。

编辑器中的成员解析代码与编译器的逻辑不一致: 当函数和方法同名时,它解析的是方法而不是函数。这一问题已得到修复。

修正了在 X64 模式下调试时的一个问题。

修复了与 SCC 集成比较源代码文件时出现的异常。

修复了 XAML 编辑器的若干问题:

o代码现在以严格的调用约定生成,以避免在启用编译器选项 “隐含 CLIPPER 调用约定” 时出现问题

o出于同样的原因,WPF 和其他模板现在都包含 STRICT 调用约定

oXAML 编辑器无法正确加载当前 DLL 或 EXE,因此在解析命名空间和向工具调色板添加用户控件时出现问题。这一问题已得到修复。

我们在 Tools/Editor/XSharp/Intellisense 选项中添加了一个选项,允许您控制编辑器中成员组合框的工作方式。你可以选择在右侧组合框中只显示当前类型或所有实体的方法和属性。左侧组合框始终显示文件中的所有类型。

更新了部分项目和项目模板。没有参数的方法和构造函数现在有了严格的调用约定。此外,在 Core 方言模板中,编译器选项 /vo15 已被明确禁用。


 

Changes in 2.0.0.3 (Bandol Beta 3)

编译器

当两个方法重载的原型相匹配时,编译器现在会优先选择非泛型方法,而不是泛型方法

修正了编译包含预处理器命令的单行源代码时可能出现的异常。

运行时

添加了 Mod() 函数

已添加不带参数的 ArrayNew() 重载

当 length(RHS) > length(LHS) 和 SetExact() == FALSE 时,修正了 __StringNotEquals() 中的问题。

添加了用于 USUAL 溢出错误的缺失字符串资源

Visual Studio 集成

改进了关键字大小写同步和缩进。打开源文件时也会同步 “关键字大小写”。

双击查找结果窗口打开源文件,不再为同一源文件打开新窗口

提高了 intellisense 的类型查找速度

修正了一个问题,该问题会导致无法查找同一命名空间中的类型

修复最新 Visual Studio 2017 版本中引入的 QuickInfo 问题

调试器中不再显示与调试器工具提示重叠的 QuickInfo 提示

编辑器窗口中包含方法和函数的组合框不再显示参数名和完整类型名。现在显示的是参数的缩写类型名

这些组合框现在还能显示另一个源文件中定义的方法和属性的文件名

修正了窗口编辑器为标签页生成代码的问题

Vulcan XPorter

解决方案文件中定义的项目依赖关系未正确转换

VO XPorter

修正了用定义值替换资源名称的问题


 

Changes in 2.0.0.2 (Bandol Beta 2)

编译器

编译器现在可以透明地同时接受用于 XBase Array 索引的 Int 和 Dword 参数

当编译器在 XSharp.VO 中发现一个弱类型的函数,而在 XSharp.Core 中发现一个强类型的函数时,编译器会选择 XSharp.Core 中的强类型函数。

在 VO 和 Vulcan 方言中,有时会显示(不正确的)“重复使用 ”警告。现在这种情况已被消除。

改进了 Start 函数的调试器信息,以避免在代码结束时不必要地退回到第 1 行

改进了 BEGIN LOCK 和 BEGIN SCOPE 的调试器断点信息

改进了多行属性的调试器断点信息

现在仅在 VO/Vulcan 方言中支持 /vo6/vo7/vo11

运行时

删除了 Array 索引器的 DWORD 重载

修正了 ErrString() 的重载问题

修正了 _DebOut() 的重载问题

修正了 DTOC() 和 Date:ToString() 中的问题

修正了 ASort() 与 VO 不兼容的问题

现在,当释放固定内存块时,它们会被填充为 0xFF,以帮助检测问题

Visual Studio

修复 VS2017 在生成时 “挂起” 的问题

修复 VS2017 中显示工具提示(QuickInfo)时的 “挂起 ”问题

修正了调试 x64 应用程序的问题

无法再重命名或删除 “属性 ”文件夹

从 “属性 ”文件夹的上下文菜单中选择 “打开”,即可打开项目属性屏幕

更新了项目树中的多个图标

转到定义的改进

生成系统

修复嵌入式资源命令行选项中 CRLF 的问题


 

Changes in 2.0.0.1 (Bandol Beta 1)

编译器

新特性

已添加对 ARRAY OF 语言结构的支持。有关详细信息,请参见 Runtime

在使用 VO 或 Vulcan 方言编译时,添加了对 X# Runtime 程序集的支持。

已添加对 “伪 ”函数 ARGCOUNT() 的支持,该函数可返回使用 clipper 调用约定编译的函数/方法中已声明参数的数量。

为给 foreach 局部变量赋值添加了一个新的警告编号。为 USING 和 FIXED 局部变量赋值将产生错误。

优化

优化了 Clipper 调用约定函数/方法的代码生成

不再支持 /cf 和 /norun 编译器选项

预处理器不再删除空白。这样,在编译使用预处理器的代码时,错误信息会更好。

某些解析器错误的描述更加详细

更改了用于确定针对 CLR2 还是 CLR4 进行编译的方法。编译器会检查 system.dll 或 mscorlib.dll 的位置。如果该位置所在路径包含 “v2”、“2.”、“v3 ”或 “3.”,则假定我们是针对 CLR2 进行编译。包含 “V4 ”或 “4. ”的路径则被视为 CLR4。不再支持编译器的 /clr 命令行选项。

现在,预处理器在检测到递归 #include 文件时会产生错误。

Bug 修复

修正了在 Vulcan 或 VO Dialect 中编译时在参数上使用 [CallerMemberAttribute] 的问题

Abstract 属性不应再对正文产生警告

现在,您可以正确使用 ENUM 值作为数组索引。

修正了使用 PUBLIC GET 和 PRIVATE SET 访问器的属性的一个问题。

修正了将接口赋值给 USUAL 时需要转换为对象的问题

修正了一个问题,即带有字面类型的 IIF 表达式会返回错误的类型(L 或 U 后缀被忽略)。

修正了 LOCAL x[10] 声明编译不正确的问题。现在可编译为包含 10 个元素的局部 VO 数组。

Visual Studio 集成

版本 1.2.1 引入了一个问题,可能导致输出文件被 intellisense 引擎锁定。现已修复

编辑器解析器在处理嵌套类型时出现问题。现已修复

X# 项目内的枚举代码完成中未包含枚举成员

代码重新格式化方面的一些改进

在 “工具/选项 ”中为编辑器添加了选项,以便在 “所有标记 ”完成列表中包含关键词

修正了一个问题,即无法加载程序集以检索元信息时,程序集会 “永远 ”重试

修正了从包含托管代码和非托管代码的程序集中检索类型信息的问题。

在 IDE 属性窗口中添加了一些引用程序集的属性

修复了 Visual Studio 2017 最新更新中引入的有关程序集引用和 Windows 窗体编辑器的问题

在 “项目属性 ”窗口中启用 XML 输出时,对于程序集名称中包含“. ”的程序集,会显示不正确的文件名。

编辑器解析器现在能更好地支持 REF 和 OUT 类型的参数

在程序集引用和 COM 引用的属性窗口中添加了对 “嵌入互操作类型 ”的支持

修复了代码模型有时会锁定项目引用的输出 DLL 的问题

生成系统

修正了 XML 文档文件的命名问题。

运行时

已添加 XSharp.Core.DLL、XSharp.VO.DLL 和 XSharp.Macrocompiler.DLL。
已实现并支持大多数运行时函数。更多信息请参阅 X# Runtime章节
 

VO XPorter

删除了 SDK 相关选项。这些选项稍后将转移到一个新工具中。


 

Changes in 1.2.1

编译器

修正了一个问题,在该问题中,编译错误会导致 “Failed to emit module” 的信息,而没有进一步的信息

修正了别名表达式(如 CUSTOMER->CUSTNO++)中 ++、-- += 和类似操作的问题

在带参数的构造函数之后,构造函数初始化器和集合初始化器不起作用。现已修复。

修正了启用溢出检查时 USUAL 中存储的负字面值的问题。

对于 CATCH 子句,现在 ID 和 TypeName 都是可选的。这意味着有 4 种变化。
您只能有一个不带类型的 catch 子句,因为它默认为 System.Exception 类型。但是,您可以使用多个不带 ID 的 catch 子句。

  CATCH ID AS ExceptionType
  CATCH ID                 // 默认为 Exception类型
  CATCH AS ExceptionType  
  CATCH           // 默认为 Exception类型

Visual Studio 集成

提高后台代码扫描速度

提高编辑器内后台解析器的速度

修正了窗口窗体编辑器使用的 codedom provider中的一个问题


 

Changes in 1.2.0

编译器

为了与 VO 和 Vulcan 兼容,现在可以为通过引用声明的参数传递 NULL。
我们强烈建议不要这样做,除非你确保函数期望这样做,并且不会在没有检查 NULL 引用的情况下赋值给引用参数。只有启用 /vo7 编译器选项后,这种做法才有效。

我们对 Lexer 进行了一些优化。因此,编译器的速度应该会更快一些

我们更正了自动生成构造函数 (/vo16) 的一个问题,该构造函数适用于继承自外部 DLL 中定义的类的类

当使用 /vo2 编译时,在调用 super 构造函数之前在子类中分配的任何字符串字段都会被空字符串覆盖。现在,只有当字符串为 NULL 时,生成的代码才会分配空字符串。
注意:我们不建议在调用 super 构造函数前在子构造函数中分配父字段。手动编码的父字段的默认值仍会覆盖在调用 super 构造函数之前在子构造函数中分配的值。

修正了 VO 方言中 CHECKED() 和 UNCHECKED() 语法的一个问题

修正了一个问题,即在一个重载存在单个 object 参数和一个重载存在 object[] 参数的情况下,为方法选择重载。

已为 LOCAL STATIC 语法分析程序添加支持

修正了编译器选项 /vo9(允许缺少返回值)和返回 VOID 的过程或方法的一个问题

改进调试器序列点生成。编译器不再为 VO/Vulcan 方言中的启动和关闭代码生成 “隐藏 ”断点信息,对于表达式语句也不再需要双步骤。

分部类的 ACCESS 和 ASSIGN 可能会生成没有源文件名的错误信息。这个问题已经解决。
现在,编译器为这些 “partial”属性生成的代码略有不同。
Access 和 Assign 是作为编译器生成的方法实现的,现在属性 getter 和属性 setter 都会调用这些方法。

编译器无法识别 _WINCALL 调用约定。现已修复。

编译器现在会在使用 #pragma 命令时发出警告

Visual Studio 集成

进一步提高编辑器的性能。特别是包含错误代码的大型源文件可能会降低编辑器的运行速度。

当包含文件只包含 #defines(如 Vulcan 头文件)时,编辑器解析器不再重复尝试解析这些文件

源代码编辑器试图为注释区域中的单词显示 intellisense。该问题已得到解决。

我们已开始开发对象浏览器和类浏览器。

项目的开启和关闭应稍快一些

现在,编辑器使用的内部代码模型会在项目关闭时处理已加载的信息,任何项目都不再需要这些信息。这将减少 X# 项目系统的内存使用量

匹配的关键字,如 IF ... ENDIF 和 FOR ... NEXT,现在应在编辑器中突出显示

如果在编辑器中选择了一个标识符,那么当前方法/函数中所有使用该标识符的地方都会高亮显示该标识符。

我们添加了几项功能,您需要在 “工具/选项/文本编辑器/XSharp/Intellisense”对话框中启用/禁用这些功能:

o按下点时,编辑器中的代码补全也支持实例成员补全。
请注意,编译器只接受 Core 语言中的这一选项,而不接受 VO 和 Vulcan 方言中的这一选项。因此,该选项在使用其他方言的项目中不起作用。

o我们添加了一些选项来控制编辑器中下拉式组合框的排序,以及这些组合框中是否应包含字段/实例变量。如果不进行排序,下拉框中的条目将按照它们在源文件中的顺序显示。

o我们添加了键入时自动完成标识符的选项。这包括locals、参数、类字段、命名空间、类型等。

子类中的重载方法,如果其签名与其重载的父类方法相同,则在完成列表中不再被视为重载方法

缺少一个引用 DLL 可能会 “杀死 ”intellisense 引擎。现在这种情况不再发生。当然,缺失的引用 DLL 的类型信息不会包含在内。

生成的 XAML 代码源文件(OBJ 文件夹中的 .g.prg 文件)中的属性和方法现在也会被解析,并包含在intellisense以及类浏览器和对象浏览器窗口中的完成列表中。

VOXPorter

现在,安装程序包含了正确版本的 VOXPorter <g> 。

VOXporter 现在支持以下命令行选项:
       /s:<source folder or aef>

         /d:<destination folder>

         /r:<runtime folder>

         /nowarning

 

针对图形用户界面类中发现的问题添加了一些代码更正

现在,从不同工作目录运行 VOXPorter 时也能找到模板文件了


 

Changes in 1.1.2

编译器

已为包含 #pragma 的代码添加编译器警告

修正了 iif() 函数和负字面值的一个问题

Visual Studio 集成

修复了键入发送(:)运算符后编辑器运行缓慢的问题

枚举值现在能在调试器中正确解码

修正了用于处理字面 FALSE 值和负数的 CodeDom 提供程序。因此,更多(Vulcan 创建的)winforms 应能顺利打开

当某些位置关键字(如 ADD 和 REMOVE)出现在冒号“: ”或点号“. ”之后时,在编辑器中不再将其显示为不完整代码的关键字;

VOXPorter

修复从 SDK 导出 VO RDD 类的问题


 

Changes in 1.1.1

编译器

修正了调试器 DO CASE 和 OTHERWISE 断点的一个问题

修正了在 #included 文件中定义的源代码的调试器断点问题

已添加对 Harbour Global 语法的支持,其中 GLOBAL 关键字是可选的

修正了带有负步长值的 FOR... NEXT 循环的一个问题

在某些情况下,没有从工作区名称或字段名称中删除用于避免关键字冲突的 @@ 前缀。现已修复

在 VO/Vulcan 方言中,当自动生成默认无参数 SUPER 构造函数调用时,会产生警告 (XS9015)。现在该错误信息已被消除。不过,生成的带参数 SUPER 构造函数调用仍会产生警告。

为 Xbase 类型名称和 XSharp Runtime 中的函数名称准备编译器

预处理器

修复了预处理器中的一个崩溃问题

对于没有匹配标记的块,预处理器会产生 “可选块不包含匹配标记 ”的错误。现在允许了。
(例如,某些数据库 UDC 中的 ALL 子句)

当多个源文件使用同一个包含文件,而该文件的不同部分因 #ifdef 条件的不同而被包含时,预处理器会感到 “困惑”。这一问题已得到修复。

无法正确处理从 #include 文件导入的源代码中的调试器文件/行号信息。

Visual Studio 集成

修复了 Windows 窗体编辑器的几个问题

VO 兼容编辑器生成的类声明现在包含 PARTIAL 修饰符。


 

Changes in 1.1

编译器

修正了 X# 1.0.3 发布后在后期绑定代码中使用代码块的问题

修复了一个问题,即在子类中覆盖从只定义了赋值(Set)或访问(Get)的类继承的属性时出现的问题。

已启用编译器选项 /vo16 :自动生成 VO Clipper 构造函数。

修复了源文件第 1 行第 1 列出现编译器错误时编译器崩溃的问题

修正了溢出检查不遵循 /ovf 编译器选项的问题

修正了接口方法 public 修饰符的问题

为外部 DLL 中无法访问的字段添加了正确的错误信息

修正了调试器序列点(调试器步进)的一个问题

X# 生成的 pdb 文件现在标有 X# 语言 GUID,因此在 VS 调试器中可识别为 X# 文件

DATETIME (26) 和 DECIMAL (27) 作为 UsualType 添加到编译器中,为允许使用这些类型的 usuals 类型的 X# 运行时做准备。

编译器选项 /VO15/VO16 现在在 VO/Vulcan 方言之外使用时会产生错误信息

在类外声明的方法(VO 风格代码)将声明 private 类,而不是 public 类

ASTYPE 已改为位置关键字

修正了 Chr() 和 _Chr() 函数在字面数字大于 127 时的一个问题

已添加对 __CLR2__ 和 __CLR4__ 编译器宏的支持。版本源于 mscorlib.dll 和/或 system.dll 的文件夹名称

代码块语法在 Core 方言中不起作用。

一些新关键字,如 REPEAT、UNTIL、CATCH、FINALLY、VAR、IMPLIED、NAMESPACE、LOCK、SCOPE、YIELD、SWITCH 等,现在也是位置关键字,只有在行首或匹配的其他关键字之后才会被识别为关键字。
当这些关键字用作函数名时,这将有助于避免出现令人费解的错误信息。

Visual Studio

源代码编辑器

为函数和过程添加了转到定义

改进函数和过程的信息提示

改进的大小写同步

添加了第一版智能缩进

修正了intellisense引擎中可能锁死 VS 的查找问题

编译器生成的类型现在不会出现在完成列表中。

已为 LOCAL IMPLIED 和 VAR 变量的intellisense添加部分支持

已添加对格式化文档的支持。这也会根据工具/选项菜单中定义的工具设置标识符的情况

改进后台文件扫描器的性能。在编译过程中,该扫描器也会暂停,以提高编译速度。

项目系统和 MsBuild

修正了项目文件中条件属性组的一个问题。现有项目将自动更新

在 MsBuild 和 VS 项目属性页面中添加了对 /vo16 编译器选项的支持。

修正了 /nostddefs 编译器选项无法正常工作的问题。

修正了在项目属性对话框中输入资源或设置时可能出现的问题

修正了 /nostdlib 编译器选项的一个问题

License.Licx 文件现在添加为 “嵌入式资源”。

修正了自动添加许可证文件的问题

当一个项目有一个 “中断的引用”,而新的引用被添加到正确的位置时,中断的引用将被删除,新的引用将被添加。

在 64 位进程内运行时,MSBuild 支持 DLL 无法找到编译器和本地资源编译器的位置

表单编辑器

改进了 Windows 窗体编辑器对项目引用中定义的类型的支持。现在,我们将检测这些项目的输出文件位置,就像 C# 和 VB 项目系统一样。

表单编辑器的代码分析器在处理未类型化的方法时出现问题。现已修复。

VO 窗口和菜单编辑器

窗口和菜单编辑器的代码生成器将删除未使用的旧定义。

更改了 VO 窗口的项目模板,以解决为尚未保存的窗口添加事件处理程序时出现的问题

窗口编辑器的代码生成器未输出 WS_VISIBLE 的样式。现已修复。

调试器

该版本引入了第一版 XSharp 调试器支持

Visual Studio 调试器现在可在调用堆栈窗口和其他地方显示 X# 语言

函数、方法和过程现在以 X# 语言风格显示在调用栈窗口中

编译器生成的变量不再显示在局部变量列表中

locals 列表现在显示的是 SELF,而不是 this

X# 预定义类型(如 WORD、LOGIC 等)会在 locals 窗口中显示其 X# 类型名称

测试

已添加对 “测试资源管理器 ”窗口的支持

添加了使用 XUnit、NUnit 和 Microsoft Test 进行单元测试的模板

其他

添加了在 XSharp 之后(重新)安装 Vulcan 时的警告,这可能会导致 Visual Studio 集成出现问题

VS 解析器将接口标记为结构而非接口。这一问题已得到修复。

在 VS 工具菜单中,XPorter 工具有了更好的名称

在查找类型信息时暂停 VS 后台分析器,以提高intellisense速度

对 X# 附带的模板进行了几处修改

XPorter

修复属性组条件中的问题。

VOXPorter

生成 clipper 构造函数现在默认为禁用

修正了 VS 模板文件中的一个问题。


 

Changes in 1.0.3

编译器

修正了使用 usual 参数索引的 Vulcan 数组的索引计算问题

修正了以 begin sequence 语句或 try 语句结束的代码自动生成返回值的问题

优化了字面符号的运行性能。
编译器现在会为字面符号生成一个符号表,应用程序中使用的每个字面符号只创建一次。
如果您的应用程序使用了大量(数千个)字面符号,启动时可能会有一点延迟。但运行时的性能应该会更好。

为使用与 VO 兼容的 _CAST 操作符将数字转换为 OBJECT 的代码添加了编译器错误。
现在已经不允许这样做了:
LOCAL nValue as LONG
LOCAL oObject as OBJECT
nValue := 123
oObject := OBJECT(_CAST, nValue)


 

Changes in 1.0.2

编译器

添加了对 XML 文档生成的支持。我们支持与 C# 编译器和其他 .Net 编译器相同的标记。

改进了一些解析器错误。

为编译器和脚本分别创建了可移植和非可移植(.Net 框架 4.6)项目

修正了从 USUAL 转换到已知类型的代码生成。现在,当 usual 中的对象类型与目标变量的类型不匹配时,会生成与 Vulcan 相同的错误信息

当声明与程序集名称相同的类型时,会产生编译器错误,并给出建议的解决方法。

修正了在方法调用中使用 PTR() 操作时出现的奇怪编译器信息

使用 VO 方言时,PSZ 中字节的索引访问现在与 VO 中一样基于 1。Vulcan 方言需要像 Vulcan 那样基于 0 的索引访问。

删除了 FLOAT 和 USUAL 复合赋值的错误信息。编译器现在包含了 Vulcan Runtime 中该问题的解决方法

对于编译器必须在函数调用和任何其他类中的静态方法调用之间做出选择的模糊代码,编译器现在会选择函数调用而不是方法调用(Vo 和 Vulcan 方言)。警告仍会生成。

当使用 @ 符号通过引用传递变量时,编译器现在会检查函数/方法参数的声明类型是否与局部变量的类型一致。

在 VO/Vulcan 方言中,一些针对未使用变量的编译器警告被抑制。现在它们又被激活了。

脚本

脚本在 1.01 版中不起作用

Visual Studio 集成

QuickInfo 可能会在 VS 编辑器中产生 “挂起 ”现象。现已修复

为 globals 和 defines 添加了快速信息

为 globals 和 defines 添加了完成列表

新增 VO 表单编辑器,用于编辑 vnfrm/xsfrm 文件并生成代码和资源

已添加 VO 菜单编辑器,用于编辑 vnmnu/xsmnu 文件并生成代码和资源

添加了 VO DbServer 编辑器和 VO Fieldspec 编辑器,用于编辑 vndbs/xsdbs 和 vnfs/xsfs 文件并生成代码和资源。

增加了关键字和标识符的同步功能。

修正了在编辑器中键入 SUPER( 可能产生异常的问题)

项目文件中的 “预生成 ”和 “生成后 ”条目现在针对特定配置了

在项目系统中添加了对 XML 文档生成的支持

修复了 Visual Studio 2017 15.3 及更高版本可能出现的 “挂起 ”问题

VO Xporter

修正了导入某些 VO 2.7 AEF 文件时出现的问题

修正了解决方案文件夹名称中可接受字符的问题

xsproj 文件中还包含 VO 表单和菜单实体

为 INI 文件添加了一个选项,用于指定 Vulcan Runtime 文件的位置 ( )


 

Changes in General Release (1.0.1.1)

编译器

修复了 Vulcan Runtime 非常老的版本的一个问题

以 DIM Byte[] 及类似方式声明的变量现在会被编译器固定

编译器未正确处理 [Return] 属性。现已修复

由于 Vulcan 运行时的问题,USUAL 和 FLOAT 的复合赋值(u+= f 或 -=)在运行时导致堆栈溢出。现在,这些表达式会生成编译器错误,并建议更改为简单赋值 ( u := u + f)

Visual Studio 集成

在解析类型时,XSharp 项目之间的项目引用也作为 assemblyreference 加载。这可能会导致速度问题和不必要的内存占用

提高了生成完成列表(如类型的方法和字段)的速度。

我们还添加了 “完成列表选项卡”,你可以在不同的选项卡上看到字段、属性、方法等。您可以在 “工具/选项/文本编辑器/XSharp/Intellisense”选项页面中启用/禁用该功能。

VO XPorter

我们添加了一项检查,以确保 X# 项目的默认命名空间不能包含空白字符


 

Changes in General Release (1.0.1)

新特性

我们新增了对 ENUM 基本类型(ENUM Foo AS WORD)的支持

我们为 Lambda 表达式添加了单独的语法

我们新增了对匿名方法表达式的支持

类型化的局部变量现在也可用于 PCALL() 调用

带有 ExtensionAttribute 属性的方法和带有 ParamArrayAttribute 属性的参数现在可以正确编译,但会发出警告

编译器

修正了字面代码块后期绑定赋值的问题

解决多个名称冲突

改进了若干错误信息

修正了只使用 SET 访问器的属性的编译问题

修正了带有 if ... endif 语句的 switch 块中的崩溃问题

修复虚实例方法和结构的问题

修正了数组字面意义中使用的 foreach 变量的名称冲突问题

更改了函数和静态方法的同名解析。
在 VO/Vulcan 方言中,函数优先于静态方法。如果要调用静态方法,则需要在方法调用前加上类名。

本文档中有一个单独的主题,介绍了代码块、Lambda 表达式和匿名方法表达式之间的语法异同。

修正了带有错误原型的 Start() 函数的错误信息。

如果检测到函数和静态方法之间存在歧义,就会显示警告信息

Visual Studio

为 “Using Static”类中的函数和方法添加了参数提示

为 Clipper调用约定函数和方法添加了参数提示

在intellisense中添加了对泛型的支持

intellisense将显示关键字,而不是本地类型名称(例如 WORD,而不是 System.UInt16)

现在,当用户输入开头的“(”或“{”以及逗号“, ”时,都会显示参数提示。

参数提示会显示 REF OUT 和 AS 修饰符

为 COM 引用(包括普通 COM 引用和主要互操作程序集)添加了智能提示。此外,已实现接口中的成员现在也包含在内嵌代码自动完成中(这在 COM 中非常常见)。

改进了其他语言(如 C# 和 VB)项目引用的直观显示。

为引用项目中的函数和引用的 Vulcan 和/或 X# 程序集添加了intellisense功能

抑制intellisense列表中的 "特殊类型名称”

已添加对 “VulcanClassLibrary ”属性的支持,以帮助查找类型和函数

本地资源编译器的错误现在也包含在错误列表中

修正了构造函数参数提示的问题

已为 X# 类型关键字(如 STRING、REAL4 等)添加成员列表支持。

修正了 Windows 窗体编辑器中与 ActiveX 控件有关的几个问题

添加了启动 VO Xporter 工具的菜单选项

添加了依赖项后台扫描功能,确保新生成的代码经过扫描后可用于intellisense

对 Windows 窗体编辑器和项目系统进行了多项修改:

o添加了对添加 ActiveX 控件的支持

o已添加对表单继承的支持。在 C# 继承表单向导中也能看到我们的表单

o添加了将 Windows 窗体自定义控件添加到 Visual Studio 工具箱的支持

oWindows 表单编辑器使用的 Codedom 解析器的一些性能增强。对于较大的表单,您应该会注意到这一点。

修复了用户报告的若干崩溃问题

本地资源文件 (.rc) 现在可在源代码编辑器中打开

提高后台解析速度

提高关键字着色速度

改进了编辑器中 “类型 ”和 “成员 ”下拉菜单的处理方式

工具

添加了 VO Xporter 工具的第一个版本

安装程序现在可以注册 .xsproj 文件、.prg、.ppo、.vh、.xh 和 .xs 文件,以便用 Visual Studio 打开它们。

文档

我们添加了一些章节,介绍如何将 VO AEF 和/或 PRG 文件转换为 XIDE 项目和/或 Visual Studio 解决方案。


 

Changes in 0.2.12

脚本

我们增加了使用 X# 脚本的功能。有关如何工作的一些文档可以在这里找到。 您还可以在 下面文件夹中查找脚本示例
c:\Users\Public\Documents\XSharp\Scripting folder

编译器

所有方言

编译器现在基于 C# 7 的 Roslyn 源代码。

现在,不同源文件中同一(分部)类的同名 Accesses 和 Assigns 将合并为一个属性。这将在一定程度上降低编译器的运行速度。我们建议您在同一源文件中定义 ACCESS 和 ASSIGN。

在预处理器中添加了对重复结果标记的支持

我们添加了编译器宏 __DIALECT_HARBOUR__

修正了类型、命名空间、字段、属性、方法、全局等之间的名称解析。Core 方言非常接近 C# 规则,其他方言则遵循 VO 规则。

添加了一些对不明确代码的警告

_Chr()使用未类型化的数值时会崩溃。该问题已得到修复。

我们对字符字面规则做了一些修改。对于 VO 和 Harbour 方言,现在有了其他规则,而对于 Core 和 Vulcan,则没有这些规则。请参见 Char 字面量

VO 和 Vulcan 方言

修复了多个 VO 兼容性问题

QUIT、ACCEPT、WAIT、DEFAULT TO 和 STORE 命令现已从编译器中移除,并在我们的标准头文件 “XSharpDefs.xh ”中定义,该文件位于 Program Files(x86)/XSharp\Include 文件夹中。这些命令不在 Core 方言中编译

已添加对 CONSTRUCTOR() CLASS MyClass 和 DESTRUCTOR CLASS MyClass(换句话说,在 CLASS ... ENDCLASS 结构之外)的支持

如果在关键字 NIL、NULL_STRING、NULL_OBJECT 等之前使用 #(不等于)运算符而不留空格,那么 #NIL 就不会被视为符号 NIL,而会被视为 Not Equal To NIL。

SizeOf 和 _TypeOf 是 VO 中的特殊标记,不能缩写。我们改变了 X# 的行为,使之与之相匹配。这样可以防止与 _type 等变量的名称冲突。

我们增加了对带有嵌入式 @ 符号的 DLL 入口点的支持,例如 “CAVOADAM.AdamCleanupProtoType@12”。

(DWORD) (-1) 将需要使用 unchecked 操作符。现在这与 Vulcan 兼容,生成的 DWORD 值为 System.Uint32.MaxValue。

STATIC VOSTRUCT 现在会被编译为 INTERNAL VOSTRUCT。这意味着您的应用程序中不能出现两次相同的结构。为什么要这样做呢?

修正了 VO 编译出 “不正确 ”代码的几种情况,例如看起来像这样的代码块:
       cb := { |x|, x[1] == 1 }
注意多出来的逗号。
现在编译成了相同的代码块:

       cb := { |x| x[1] == 1 }

由于 /vo16 编译器选项有太多副作用,目前已(译者注:暂时)被禁用(不起任何作用)。

Visual Studio 集成

删除的文件和文件夹会被移动到回收站。

修正了 XAML 编辑器中的intellisense问题

添加了对不同 X# 项目之间代码完成的支持

为 VB 和 C# 项目中的源代码添加了对代码完成和其他intellisense功能的支持

已添加对参数信息的支持

文档

我们为所有未注明的编译器错误添加(生成)了主题。有些主题只包含编译器显示的文本。更多文档将陆续发布。此外,我们还为 X# 脚本添加了一些文档。


 

Changes in 0.2.11

编译器

所有方言

改进了某些错误信息,例如未终止字符串的错误信息

已添加对 /s(仅限语法检查)命令行选项的支持

已添加对 /parseonly 命令行选项的支持,该选项用于intellisense解析器

针对无效代码添加了一些编译器错误和警告

预处理器没有正确处理 #command 和 #translate 的 4 个字母缩写。现已修复

修正了预处理器中发现的一些问题

我们改用了新的 Antlr 解析器运行时。这样性能应该会略有提高。

更改了字面字符和字符串的定义方式:

o在 Vulcan 方言中,用单引号括起来的字面字符串是 Char 字面量。双引号是 String 字面量

o在 Core 和 VO 方言中,用单引号括起来的字面字符串就是 String 字面量。双引号也是 String 字面量。
要在 Core 和 VO 中指定 Char 字面量,需要在字面量前加上 “c”:

 

    LOCAL cChar as CHAR
     cChar := c'A'        

更改了字面字符和字符串的定义方式:

在为 x86 或 x64 编译时,sizeof() 和 _sizeof() 不再产生需要 “不安全 ”代码的警告。但在为 AnyCpu 编译时,仍会产生警告。

如果未设置 includedir 环境变量,则也无法自动找到 XSharp\Include 文件夹。

VO/Vulcan 兼容性

已添加 /vo16 编译器选项,以便为没有构造函数的类自动生成带有 Clipper 调用约定的构造函数

Harbour 兼容性

开始编写 Harbour 方言。这与 VO/Vulcan 方言完全相同。目前唯一的区别是,IIF() 表达式是可选的

Visual Studio

新特性 / 更改的行为:

新增括号匹配功能

添加了速览定义(Alt-F12)

所有关键字不会自动成为完成列表的一部分

修正了命名空间内函数和过程的成员查找问题

提高大型项目的后台解析器速度

修复从父类查找字段和属性的类型

修正了 CSharp 项目无法找到 XSharp 项目引用输出的问题

智能感应解析器现在可正确使用所有当前项目的编译器选项。

当 X# 语言缓冲区被输入 C# 代码等 “垃圾 ”时,防止程序崩溃

安装

VS2017 的本地模板缓存和组件缓存未正确清除,现已修复。

已添加代码,以便在安装时正确取消注册现有的 CodeDomProvider

文档

现在隐藏了几个空章节。

添加了模板说明


 

Changes in 0.2.10

该版本重点解决了 VO 和 Vulcan 兼容性方面的最后遗留问题,并为 Visual Studio 集成添加了大量新功能。

编译器

VO/Vulcan 兼容性

我们已完成对 DEFINE 关键字的支持。类型子句现在是可选的。如果未指定类型,编译器将找出定义的类型。
如果在编译时无法确定表达式(例如字面日期或符号),DEFINE 将被编译为函数类的常量字段或只读静态字段。

我们扩展了预处理器 。它现在支持 #command、#translate、#xcommand 和 #xtranslate。此外,还支持 “伪函数” 定义,如 :
 
       #define MAX(x,y) IIF((x) > (y), (x), (y))
 
其工作原理与 #xtranslate 相同,但定义是区分大小写的(除非启用了 “VO 兼容预处理器 ”选项 (/vo8).
预处理器中唯一不起作用的是重复结果标记

在 VO/Vulcan 模式下,编译器现在可以接受ENDIF 和 NEXT 等关键字与语句结尾之间的 “垃圾”,就像 VO 编译器一样。
因此,您不必再删除 NEXT 或 ENDIF 之后的 “注释 ”标记。这将在不更改 VO 和 Vulcan 方言的情况下进行编译:
 
  IF X == Y
      DoSomething()
  ENDIF X == Y

  FOR I := 1 to 10
     DoSomething()
  NEXT I
我们不推荐这种编码方式,但这种代码非常常见...

修正了单引号字符串的识别问题。现在这些字符串被视为 STRING_CONST,编译器后台也进行了调整,以便在需要时将 STRING 字面量转换为 CHAR 字面量。

在 VO 和 Vulcan 方言中,当使用编译器选项 /vo1 时,Init() 和 Axit() 方法允许使用不带值或返回值为 SELF 的 RETURN 语句。其他返回值将触发编译器警告并被忽略。

新特性 / 更改的行为:

编译器现在在源文件以未终止的多行注释结尾时会产生错误。

添加了 ASTYPE 表达式,类似于其他语言中的 AS 结构。这将分配一个正确类型的值,如果表达式的类型不正确,则分配 NULL:
       

       VAR someVariable := <AnExpression> ASTYPE <SomeType>
 

如果参数是编译时常数,Chr() 和 _Chr() 函数现在会转换为字符串或字符字面量

对于包含大量函数、过程、定义、全局或 _dll 函数的程序集,编译速度有所提高。

_DLL 函数现在会自动标记为 CharSet.Auto

修正了冒号(:)和点号(.)互操作性与 super 关键字之间的一些不一致之处

修正了 FOX 订阅者和其他用户报告的几个编译器问题。

Visual Studio

新特性 / 更改的行为:

经测试可与 Visual Studio 2017 发布版本一起使用

我们在 VS 编辑器中添加了对区域的支持。目前,大多数 “实体 ”以及语句块、区域和使用列表、#includes 和注释都是可折叠的。

我们在 VS 编辑器中添加了对成员和类型下拉菜单的支持

我们在 VS 编辑器中添加了对代码自动补全的支持

我们在 VS 编辑器中添加了对 "转到定义" 的支持

现在,智能感应扫描检测到的错误也包含在 VS 错误列表中。

我们为 VS 错误列表中的错误添加了帮助链接。帮助链接将带您进入 X# 网站上的相应页面。虽然不是所有的帮助页面都已完成,但至少基础架构已经正常运行。

我们增加了对代码片段的支持,并在安装程序中加入了多个代码片段

我们对项目属性对话框做了几处修改

o生成前和生成后事件现在位于 “项目属性 ”的单独页面上。这些事件现在也不是按配置定义的,而是在不同配置之间共享。
如果要将输出结果复制到不同配置的不同文件夹中,应使用 $(Configuration) 和 $(Platform) 变量

o我们已将 Platform 和 Prefer32Bits 属性移至 “生成” 页面,使其取决于配置

o修正了 AnyCPU 平台大小写的一个问题,该问题会导致 VS 平台组合框中出现重复项目

o添加了对 ARM 和 Itanium 平台类型的支持

o某些属性保存在没有平台标识符的项目文件组中。现已修复

o我们添加了一个项目属性,用于控制托管文件资源的包含方式:  使用与 Vulcan 兼容的托管资源
如果为 “True”,则资源文件包含在程序集中,不带命名空间前缀。当 “False ”时,资源文件将以应用程序的命名空间作为前缀,就像其他 .Net 语言(如 C#)一样。

我们更正了一些代码生成问题

Windows 窗体编辑器中使用的解析器现在也能正确处理背景图片。无论是表单 resx 中的图像,还是共享项目资源中的背景图像

我们为项目系统添加了 Nuget 支持。

我们做了几处修改,以修复项目文件中的问题

o项目系统现在可静默修复重复项目问题

o修正了 xaml 文件与其依赖的 designer.prg 文件和其他依赖文件之间的依赖关系问题

o修正了子文件夹或文件夹树中包含点的文件夹名称中的从属项的问题。

o修正了 WPF 模板中的一个问题

修复了删除引用节点时的刷新问题

添加了 JetBrains 使用的 OAProject.Imports 属性的实现

XPorter

修复了一个转换 WPF 风格项目的问题


 

Changes in 0.2.9

编译器

除了 Vulcan 没有发现的 Vulcan SDK 中的一些明显错误外,您可以在不做任何更改的情况下编译 Vulcan SDK!

根据编译器的当前状态,我们认为编译器的 Vulcan 兼容性已经完成。现在,所有 Vulcan 代码的编译都不会出现问题。

VO/Vulcan 兼容性

新特性 / 更改的行为:

现在,所有 Init 程序都能在启动时正确调用。因此,不仅是 VOSDK 库中的 Init 程序,其他库中的 init 程序和主 exe 程序也会被正确调用。

更改了方法和类型解析代码:

o现在,带单一 object 参数的方法比带 Object[] 参数的方法更受青睐

o当一个函数(静态方法)和一个实例方法同时存在时,我们现在会在方法内部的代码中调用静态方法,而不会使用 SELF: 或 SUPER: 前缀。

o在使用 @ 操作符通过引用传递变量的情况下。

o使其与 Vulcan 更为兼容,以便使用不同数字类型的重载。

o优先选择有特定参数的方法,而不是有 usual 参数的方法

o为避免出现类型和命名空间同名的问题。

o当只传递一个参数时,优先选择带 OBJECT 参数的方法,而不是带 OBJECT[] 参数的方法

o当在引用程序集中检测到 2 个相同的函数或类型时,我们现在会像 Vulcan 一样选择第一个引用程序集中的函数或类型,并生成警告 9043

sizeof 操作符现在返回 DWORD,以便与 VO 和 Vulcan 兼容。

新增了对 EXIT PROCEDURES(PROCEDURE MyProcedure EXIT)的支持。这些程序将在程序关闭时自动调用,就在所有全局变量被清除之前。
现在,编译器会为每个程序集生成一个 $Exit 函数,调用其中的退出程序,并清除程序集中的全局引用。在主程序中创建的 $AppExit() 函数将调用所有引用 X# 程序集中的 $Exit 函数。当引用 Vulcan 编译的程序集时,所有公共全局引用将从 $AppExit() 函数中清除。

添加了对 PCALL PCALLNATIVE 的支持

添加了对多个 Vulcan 兼容编译器选项的支持:

o/vo1 允许在构造函数和销毁函数中使用 Init() 和 Axit() 函数

o/vo6 允许(全局)函数指针。DotNet 不 “认识 ”这些指针。它们被编译为 IntPtr。函数信息将被保留,因此您可以在 PCALL() 中使用这些指针。

o/ppo 将预处理后的编译器输出保存到文件中

o/Showdefs 在控制台上显示定义及其值的列表

o/showincludes 在控制台上显示包含的头文件列表

o/verbose 在控制台上显示包含、源文件名、定义等信息。

oDEFAULT TO 命令

oACCEPT 命令

oWAIT 命令

若干代码生成变更:

o更改了 VOStruct 数组内 DIM 元素的代码生成,因为 Vulcan 编译器依赖于特定的命名方案,无法识别我们的名称。

o改进了使用 CLIPPER 调用约定的方法内部代码生成。

Bug 修复

现在,只有启用 /ins 编译器选项时,才会使用隐式命名空间。在 Vulcan 方言中,命名空间 Vulcan 总是包含在内。

修正了 @ 操作符和 VOSTRUCT 类型的几个问题

修复了 VOSTRUCT 类型的 DIM 数组的一个问题

修正了 VOSTRUCT 和 UNION 类型中 LOGIC 值的问题

修正了 VOStyle _CAST 和转换操作符的几个问题。

修正了几个数字转换问题

修正了混合使用 NULL、NULL_PTR 和 NULL_PSZ 时的若干问题

修正了 _CAST 操作符的几个问题

修正了 PSZ 比较的几个问题。X# 现在可以像 Vulcan 和 VO 一样工作,并产生相同(有时无用)的结果

修正了多维 XBase 数组 USUAL 数组索引的一个问题

修正了最后表达式为 VOID 的代码块问题

更改了 NULL_SYMBOL 的代码生成

预处理器 #defines 有时会与类名或命名空间名冲突。例如,当选择 /vo8 时,System.Diagnostics.Debug.WriteLine() 方法无法调用,因为 DEBUG 定义删除了类名。我们修改了预处理器,使其不再替换 DOT 或 COLON 操作符前后的单词。

修复了启用后期绑定后调用 System.Object 类中静态方法时编译器崩溃的问题

修正了 PROPERTY GET 和 PROPERTY SET 中的 String2Psz() 问题

还有很多更改。

所有方言

新特性 / 更改的行为:

对代码生成进行了多项修改:

oACCESS 和 ASSIGN 的代码生成已发生变化。类中不再有单独的方法,但这些方法的内容现在已内联到生成属性的 Get 和 Set 方法中。

o优化了 IIF 语句的代码生成。

o调试器/步骤信息已得到改进。调试器现在也应在 IF 语句、FOR 语句、CASE 语句等语句时停止。

对使用 SELF 关键字定义的属性的索引访问现在也可以使用 “Index”属性名了

暂时不允许使用类内函数和过程

ASSIGN 方法内的 RETURN <LiteralValue> 将不再分配变量并产生警告

现在有几个关键字也可以作为标识符(不再需要@@作为前缀):
Delegate, Enum, Event, Field, Func, Instance, Interface, Operator, Proc, Property, Structure, Union, VOStruct
因此,以下代码现在是有效代码(但不推荐使用):
 
FUNCTION Start AS VOID
  LOCAL INTERFACE AS STRING
  LOCAL OPERATOR AS LONG
  ? INTERFACE, OPERATOR
  RETURN

您可以看到,Visual Studio 语言支持还识别出 INTERFACE 和 OPERATOR 在此上下文中不作为关键字使用

Bug 修复

修正了 REPEAT UNTIL 语句的一个问题

修正了包含 DO CASE 但没有匹配 END CASE 的代码崩溃问题

修正了 _DLL FUNCTION 和 _DLL PROCEDURE 代码生成中的几个问题

修正了在程序集中嵌入本地资源的问题(在 Roslyn 代码中)。

修正了_OR() 和 _AND()运算符在使用 2 个以上参数时出现的问题。

已添加使用 VO/Vulcan 语法对指针取消引用的支持: DWORD(p) => p[1]

修正了 @ 操作符的几个问题

当两个分部类具有相同的名称和不同大小写时,编译器无法正确合并类的定义。

当代码中的 #define 与命令行中的定义相同时,修复了崩溃问题

索引指针访问不遵守 /AZ 编译器选项(总是假定基于 0 的数组)。现已修复

修正了预处理文件的缓存问题,尤其是包含 #ifdef 结构的文件。

修正了当两个分部类名称相同但大小写不同时可能出现的问题

修正了当引用的程序集有重复命名空间时编译器崩溃的问题。

修正了带有 [DllImport] 属性的函数的问题。

ACCESS/ASSIGN 方法的错误信息有时会指向源文件中一个奇怪的位置。这一问题已得到修复。

修正了带有 STATIC 修饰符的 Init 程序的问题

修正了预处理器在检测头文件的编码时出现的问题。这可能会导致在读取带有特殊字符(如版权标志 ©)的头文件时出现问题。

还有很多修复

Visual Studio 集成

在用户界面和生成系统中添加了对所有编译器选项的支持

修复了子文件夹中依赖文件项的问题

优化编译器选项不起作用

"清除" 生成选项现在还能清除错误列表

在某些情况下,即使输出窗格中有信息,错误列表仍然是空的。这一问题已得到解决。

xsproj 文件中的 <Documentationfile> 属性会导致项目重建,即使源代码没有更改也是如此

早期版本的 XPorter 创建的 xsproj 文件可能无法正常生成。现在,项目系统会自动修复这一问题

修正了一个与生成系统和某些嵌入式托管资源有关的问题

 

文档

我们在命令行选项中增加了许多描述

我们添加了最常见的编译器错误和警告


 

Changes in 0.2.8

编译器

VO/Vulcan 兼容性

默认参数现在可以像 VO 和 Vulcan 一样处理。这意味着您也可以将日期常量、符号常量等作为默认参数

字符串 “单个等号” 规则现在与 “可视对象” 100% 相同。我们发现有一种情况,Vulcan 返回的结果与 Visual Objects 不一致。我们选择与 VO 兼容。

在 VO/Vulcan 模式下编译时,将自动调用 VO SDK 库中的启动程序。您不必再在代码中调用这些程序。 此外,主程序集中的初始程序也会在启动时被调用。

实现了 /vo7 编译器选项(隐式转换)。这还包括支持在 REF 参数中使用 @ 符号

现在,您可以使用 DOT 操作符访问 VOSTRUCT 变量中的成员了

我们修复了几个 USUAL - 其他类型转换问题,这些问题在以前的版本中需要进行转换

现在,编译器可以正确解析包含 DECLARE METHOD、DECLARE ACCESS 和 DECLARE ASSIGN 语句的 VO 代码,并忽略这些语句。

现在,编译器会将 “VO Style ”编译器 pragma(~“keyword”)解析为空格,并忽略这些空格。

修正了一个问题,即使用 “LOCAL aSomething[10] AS ARRAY ”语法声明的数组不会以适当的元素数初始化

修正了使用单个 USUAL 参数调用 Clipper Calling Convention 构造函数时出现的问题

_DLL 实体上的属性无法正确编译。这些属性暂时会被识别,但会被忽略。

修正了几个数字转换问题

新特性

我们添加了对集合初始化Object 初始化程序的支持

匿名类型成员不再需要命名。如果选择一个属性作为匿名类型成员,那么匿名类型也将使用相同的属性名称。

缺失的结束关键字(如 NEXT、ENDIF、ENDCASE 和 ENDDO)现在会产生更好的错误信息

现在,IIF() 表达式也可以作为表达式语句使用。生成的代码与 IF 语句相同

FUNCTION IsEven(nValue as LONG) AS LOGIC
  LOCAL lEven as LOGIC
  IIF( nValue %2 == 0, lEven := TRUE, lEven := FALSE)
RETURN lEven

我们确实不鼓励隐藏赋值操作,但如果您确实使用了这种编码风格,它现在可以正常工作<g>。

现在允许将 AS VOID 作为 PROCEDURE 的(唯一)类型规范

我们在 exe 中为共享编译器添加了一个 .config 文件,它应该能让编译器运行得更快。

现在,编译时会自动包含 XSharp 中的 XSharpStdDefs.xh 文件。该文件暂时声明了 CRLF 常量。

编译器现在会缓存包含文件。这将提高依赖大型包含文件(如 Vulcan 的 Win32APILibrary 头文件)的项目的编译速度。

如果在外部程序集中找到一个函数,而在当前程序集中找到一个具有相同名称和参数的函数,那么编译器将使用当前程序集中的函数

改进编译器关于缺少闭合符号的错误信息

改进了意外标记的编译器错误信息

Bug 修复

编译器没有正确处理几个带减号的命令行选项

修复了与向后期绑定的属性分配 NULL_OBJECT 或 NULL 有关的若干崩溃问题

分部类不再需要在每个源代码位置指定父类型。当然,指定时父类型必须相同。类实现的父接口也可以分布在多个位置上

我们更正了在大型包含文件中出现错误/警告时可能导致崩溃的问题

抽象方法不再使用 /vo3 获得虚修饰符

修正了子类中的虚方法会隐藏父类方法的问题

自动返回值生成也会生成 ASSIGN 方法的返回值。这一问题已得到修复。

我们修复了 LINQ 表达式的连接子句中一个会导致编译器异常的问题

/vo10(兼容 iif)编译器选项不再在 Core 方言中添加强制转换。只有 VO/Vulcan 方言才会这样做

Visual Studio 集成

我们更改了错误列表和输出窗口的更新方式。在以前的版本中,输出窗口中可能会缺少某些行,而且错误代码列是空的。现在应该可以正常工作了。

我们从其他一些基于 MPF 的项目系统中合并了一些代码,如 WIX(称为 Votive)、NodeJS 和 Python(PTVS),以帮助扩展我们的项目系统。因此

o我们的项目系统现在支持链接文件

o我们的项目系统现在支持 “显示所有文件”,您现在可以包含和排除文件。该设置会保存在 .user 文件中,因此您可以根据需要将其从 SCC 中排除。

o我们做了一些更改,以更好地支持 “拖放 ”功能

我们更正了几个与从属项目有关的问题

在包含表单或用户控件的文件中加入表单或用户控件时,现在可以识别这些表单或控件,并在项目文件中设置相应的子类型,这样就可以打开窗口表单编辑器了

我们现在支持为 .Settings 和 .Resx 文件生成源代码。

托管资源编辑器和托管设置工具中可在内部代码和公共代码之间进行选择的组合框现已启用。在组合框中选择不同的值将改变文件属性中的工具。

编译器和本地资源编译器的最后响应文件现在保存在用户 Temp 文件夹中,以帮助调试问题。

现在,响应文件将每个编译器选项都放在新的一行,以便在必要时更容易阅读和调试。

代码生成现在保留了实体(方法)之间的注释

我们修复了模板中的几个小问题

当错误和警告的数量大于 500 的内置限制时,将显示一条信息,说明错误列表已被截断

在生成过程结束时,输出窗口将写入一行内容,列出发现的警告和错误总数

源代码编辑器中的颜色现在与 C# 和 VB 等标准语言的源代码编辑器共享。

如果源代码中有一个不活动的代码段,并嵌入了一个计算值为 FALSE 的 #ifdef,那么该代码段将显示为灰色,并且不会出现关键字高亮显示。编辑器的源代码分析器会获取包含文件并尊重路径设置。应用程序属性对话框和活动配置中的定义尚未得到尊重。这将在下一个版本中实现。

 

 

Changes in 0.2.7.1

编译器

编译器不接受 AssemblyFileVersion 属性和 AssemblyInformationVersion 属性的通配符字符串。现已修复

无法识别 #Pragma 命令 #Pragma Warnings(Push) 和 #Pragma Warnings(Pop)。现已修复。

编译器无法识别 global::System.String.Compare(..) 这样的表达式。现已修复

Visual Studio 集成

无法正确识别项目子文件夹中的从属项目,打开项目时可能会出错

修复了 VulcanApp 模板中的一个问题

Windows 窗体编辑器无法打开没有 begin namespace ... end namespace 的文件中的窗体。现已修复

源代码文件中 “实体” 之间的源代码注释现在可以正确保存,并在表单编辑器重新生成源代码时恢复原状

抑制生成源代码中不必要的空行

XPorter 工具现在是安装程序的一部分。

续行符后的注释未正确着色

更改了 XSharp VS 编辑器的配色方案,使某些项目更易于阅读

新的托管资源文件不会被标记为适当的项目类型。因此,资源在运行时不可用。这一问题已得到修复。

在属性窗口中添加了 “Copy to Output Directory(复制到输出目录)” 属性

安装

现在,installer.exe 文件和文档都有证书签名


 

Changes in 0.2.7

编译器

新特性:

已添加对 VOSTRUCT 和 UNION 类型的支持

添加了对作为数值的类型的支持,例如在构造
       IF UsualType(uValue) == LONG

为变量添加了 FIXED 语句和 FIXED 修饰符

已添加对 插值字符串的支持

现在允许在 SWITCH 语句中使用空开关标签。它们可以与下一个标签共享执行。
新增了错误 9024(SWITCH 语句内不允许使用 EXIT 语句),如果尝试退出围绕 switch 语句的循环,则会出现该错误。
这是不允许的。

已添加对多个 /vo 编译器选项的支持:
- vo8(兼容预处理器行为)。这使得预处理器定义不区分大小写。此外,值为 FALSE 或 0 的定义将被视为 “未定义”。
- vo9(允许缺失 Return 语句)编译器选项。使用 /vo9 时也允许缺少返回值。
新增警告 9025(缺少 RETURN 语句)和 9026(缺少 RETURN 值)。
- vo12(Clipper 整数除法)

现在,预处理器会自动定义从 __VO1__ 到 __VO15__ 的,根据编译器选项的设置,宏值为 TRUE 或 FALSE。

FOX 订阅版本的编译器现在以 Release 模式发布,速度更快。此外,还安装了调试版本的编译器,以便在需要时帮助查找编译器问题。

更改的行为

编译器为 Core 方言生成的 Globals 类现在称为 Functions,而不再是 Xs$Globals。

现在,重载 VulcanRTFuncs 中的函数无需指定命名空间:
当编译器找到两个候选函数,其中一个在 VulcanRTFuncs 中,那么就会选择不在 VulcanRTFuncs 中的函数。

现在,VO/Vulcan 方言的 9001 号警告(隐含不安全修饰符)已被抑制。不过,如果编译不安全代码,必须通过 /unsafe 编译器选项!

改进了编译器发布模式的错误信息

Bug 修复

Switch 语句中的 RETURN 和 THROW 语句会产生 “代码不可达” 警告。现已修复

修复了有符号和无符号数组索引混合使用时的几个问题

修正了 FOR ... NEXT 语句的几个问题。现在,“To ”表达式将在循环的每次迭代中进行计算,就像在 VO 和 Vulcan 中一样。

修复了若干编译器崩溃问题

修正了构造函数隐式代码生成的问题

修正了静态函数内静态变量的可见性问题

Visual Studio 集成

修正了在同一个 Visual Studio 中使用 XSharp 和 Vulcan.NET,以及从输出窗口或查找结果窗口打开文件时选择了错误的语言服务的问题

修正了生成代码中 “异常” 行尾的一些问题

修正了类库模板中的一个问题

修正了启动调试器时使用非标准命令行的问题

 

Changes in 0.2.6

编译器

已添加事件定义的替代语法。请参阅文档中的 EVENT 关键字

增加了代码块支持

实现了 /vo13(兼容 VO 的字符串比较)

已添加对 /vo4(与 VO 兼容的隐式数字转换)的支持

现在完全支持别名表达式

修正了 &= 运算符的一个问题

修正了几处源代码不正确导致的崩溃。

修正了几个与 usual、float 和 date 的隐式转换有关的问题

索引属性(如 String:Chars)现在可按名称使用

索引属性现在可以使用不同参数类型的重载

已添加对索引式 ACCESS 和 ASSIGN 的支持

修复了在调用 Clipper Calling Convention 函数和/或方法时使用单个参数的问题

修复了预处理器中定义的崩溃问题

_CODEBLOCK 现在是 CODEBLOCK 类型的别名

修正了使用括号或方括号定义但不带实际参数的属性的崩溃问题

Visual Studio 集成

完成对 Windows.Forms 的 .designer.prg 支持

修复了 CodeDom 生成器在为服务生成包装器时的一个问题

XSharp语言服务将不再用于Vulcan PRG文件的Side by Side安装。

改进了编辑器处理大型源文件的性能。

现在,所有生成的文件都以 UTF 格式存储,以确保特殊字符的正确存储。如果在生成代码时看到有关代码页转换的警告,请从 Visual Studio 菜单中选择 “文件 - 高级保存选项”,然后选择 Unicode 文件格式,将文件保存为 UTF 格式。

 

Changes in 0.2.51

Visual Studio 集成 & 生成系统

本地资源编译器现在能 “找到 ”头文件,如 Vulcan.NET include 文件夹中的 “VOWin32APILibrary.vh”。此外,在 “正常 ”信息模式下运行时,资源编译器的输出现在不再那么冗长。在 “详细 ”或 “诊断 ”模式下运行时,输出现在也包括资源编译器的冗长输出。

编译器

修正了一个会导致 PDB 文件无法使用的问题

"重复定义但值不同“(9012)的错误已改为警告,因为我们的预处理器进行文本比较时,并没有  ”看到“ ”10 “ 和 ”(10)“ 以及 ”0xA“ 和 ”0xa" 是相同的。当然,您有责任确保这些值确实相同。

指数 REAL 常量只能使用小写字母 “e”。现在不区分大小写了

对解析器的 _DLL FUNCTION 和 _DLL PROCEDURE 规则做了一些修改。现在,我们能正确识别 “DLL 提示”(#123),并允许在这些定义中进行扩展。顺序号也能正确解析,但会产生错误 (9018),因为 .Net 运行时不再支持这些顺序号。此外,调用约定现在是强制性的,生成的 IL 代码包括 SetLastError = true 和 ExactSpelling = true。

修正了 ~ 运算符的一个问题。VO 和 Vulcan(以及 X#)将该运算符用作一元运算符和二元运算符。
一元运算符进行 bitwise negation(一元补码),二元运算符进行 XOR。
这与 C# 不同,在 C# 中,~ 运算符是 Bitwise Negation,^ 运算符是 XOR(当然,我们的 Roslyn 后端使用的是 C# 语法)。

 

Changes in 0.2.5

Visual Studio 集成

修正了为 WPF 生成时输出文件名包含管道符号的问题

修复了 WPF 表单、页面和用户控件的项目类型问题

安装程序现在可以选择不从已安装的 Vulcan 项目系统中删除 PRG、VH 和 PPO 项目的关联。

在项目中添加了对几种新项目类型的支持

新增对嵌套项目的支持

为 WPF、RC、ResX、设置、位图、光标等添加了多个项目模板。

生成系统

添加了对新的 /vo15 命令行开关的支持。

添加了对编译本地资源的支持。

编译器

使用 VO/Vulcan 方言编译时,现在必须引用 VulcanRT 和 VulcanRTFuncs。

为 VO/Vulcan 数组的索引访问添加了支持

已添加对 VO/Vulcan 风格构造器链的支持(其中 SUPER() 或 SELF() 调用不是构造器主体内的第一次调用)

在 VO/Vulcan 方言中添加了对 &() 宏操作符的支持

在 VO/Vulcan 方言中添加了对 FIELD 语句的支持

o该语句被编译器识别

oFIELD 语句中列出的字段现在优先于同名的局部变量或实例变量

在 VO/Vulcan 方言中添加了对 ALIAS 操作符 (->) 的支持,但别名表达式 (AREA->(<Expression>) 除外。)

已添加对后期绑定代码的支持(在 VO/Vulcan 方言中)

o后期绑定方法调用

o后期绑定属性 get

o后期绑定属性 set

o后期绑定的委托调用

新增了 /vo15 命令行选项(允许未类型化的局部变量和返回类型):
默认情况下,VO/Vulcan 方言允许缺失类型,并用 USUAL 类型替换。
如果指定 /vo15-,则不允许使用未类型化的 locals 和返回类型,必须指定它们。
当然,您也可以将它们指定为 USUAL

在为 VO/Vulcan 方言编译时,? 和 ?? 语句现在可直接映射到相应的 VO/Vulcan 运行时函数。

我们现在还支持 VO 和 Vulcan 方言的 VulcanClassLibrary 属性和 VulcanCompilerVersion 属性。
有了这种支持,Vulcan 宏编译器和 Vulcan Runtime 应该能够找到我们的函数和类

现在,生成的静态类名称与 VO & Vulcan 方言中 Vulcan 生成的类名称更加一致。

为 USUAL 类型添加了几种隐式转换操作。

在访问 VO & Vulcan 方言中的某些功能(如 USUAL 类型)时,编译器现在会检查是否包含 VulcanRTFuncs.DLL 和/或 VulcanRT.DLL。
如果没有,则会显示有意义的错误信息。

已添加对固有函数 _GetInst() 的支持

修正了区分大小写的命名空间比较的一个问题

修正了 operator 方法中的一个问题

添加了预处理器 __DIALECT__, __DIALECT_CORE__, __DIALECT_VO__ 和 __DIALECT_VULCAN__

_Chr() 伪函数现在将被映射为 Chr() 函数

已添加对参数列表中缺少参数的支持(仅限 VO 和 Vulcan 方言)

修正了计算头文件中标记位置时的崩溃问题

现在,安装程序会将 Vulcan 头文件复制到 XSharp Include 文件夹中

已添加在 (VO) 字面数组构造函数中跳过参数的支持

文档

在 Visual Studio 帮助集中添加了 XSharp 文档

已添加 Vulcan 运行时参考文档

 

Changes in 0.2.4

Visual Studio 集成

双击错误浏览器中的错误现在可以正确打开源文件并定位光标

修正了项目和项目模板中的几个问题

现在,安装程序还会检测 Visual Studio 15 预览版,并在此环境中安装我们的项目系统。

生成

修正了 /unsafe 编译器选项的一个问题

修正了 /doc 编译器选项的一个问题

总是将警告视为错误。现已修复。

编译器

已添加对带有表达式列表的 Lambda 表达式的支持

LOCAL dfunc AS System.Func<Double,Double>

dfunc := {|x| x := x + 10, x^2}

? dfunc(2)

已添加对带有语句列表的 Lambda 表达式的支持

 LOCAL dfunc AS System.Func<Double,Double>

 dfunc :=        {|x|

                         ? 'square of', x

                         RETURN x^2

                 }

添加了对 NAMEOF 固有函数的支持

FUNCTION Test(cFirstName AS STRING) AS VOID

 FUNCTION Test(cFirstName AS STRINGAS VOID

 IF String.IsNullOrEmpty(cFirstName)

         THROW ArgumentException{"Empty argument", nameof(cFirstName)}

 ENDIF

已添加对使用 Clipper 调用约定创建方法和函数的支持(仅限 VO 和 Vulcan 方言)

Using 语句现在可以包含变量声明:

原来:

    VAR ms := System.IO.MemoryStream{}

    BEGIN USING ms

         // do the work

 

END USING

现在:

 BEGIN USING VAR ms := System.IO.MemoryStream{}

         // do the work

END USING

已添加对 /vo10(兼容 IIF 行为)的支持。在 VO 和 Vulcan 方言中,表达式被转换为 USUAL。在 Core 方言中,表达式被转换为 OBJECT。

VO 和 Vulcan 方言的新语言特性

现在允许在构造函数的任何位置调用 SELF() 或 SUPER() 构造函数(仅限 VO 和 Vulcan 方言)。Core 方言仍要求将构造函数链作为构造函数主体内的第一个表达式

已添加对 PCOUNT、_GETFPARAM 和 _GETMPARAM 固有函数的支持

已添加对 String2Psz() 和 Cast2Psz() 的支持

已添加对 BEGIN SEQUENCE ... END 的支持

增加了对 BREAK 的支持

已修复的问题:

嵌套的数组初始化器

BREAK 语句的崩溃

泛型参数的 Assertion 错误

关于常量隐式引用的 Assertion

允许在构造函数上使用 ClipperCallingConvention 属性,即使该属性被标记为 “仅适用于方法” 也是如此

修正了全局常量声明的一个问题

索引属性内的 __ENTITY__ 预处理器宏

 

Changes in 0.2.3

Visual Studio 集成

我们已改为使用 Visual Studio Integration 的 MPF 风格。

我们增加了对 Windows 窗体编辑器的支持

我们增加了对 WPF 编辑器的支持

我们已添加了对 Codedom Provider 的支持,这意味着上述两个编辑器将使用解析器和代码生成器

对项目属性页面进行了详细说明。现在可以使用更多的功能。

我们添加了几个模板

生成系统

新增了对多个命令行选项的支持,如 /dialect

运行共享编译器时,命令行选项未正确重置。这一问题已得到修复。

生成系统会将传给 Visual Studio 的错误数量限制为每个项目最多 500 个。命令行编译器仍会显示所有错误。

编译器

我们已开始为 Vulcan 提供自带运行时支持。请参见下面的单独标题。

现在还支持 __SIG__ 和 __ENTITY__ 宏,以及 __WINDIR__ 、 __SYSDIR__ 和 __WINDRIVE__ 宏。

调试器说明已得到改进。使用此版本,你将获得更好的调试体验

一些表明类型与方法参数、返回类型或属性类型之间存在可见性差异的错误已变为警告。当然,您应该考虑在代码中修正这些问题。

#Error 和 #warning 预处理器命令不再要求参数为字符串

现在,编译器会对 SLen() 函数调用进行内联(就像在 Vulcan 中一样)

AltD() 函数将在 IF System.Diagnostics.Debugger.IsAttached 检查中插入对 “System.Diagnostics.Debugger.Break” 的调用。

修复了若干编译器崩溃问题

为方法和函数参数添加了 PARAMS 关键字支持。

修正了 DYNAMIC 类型的一个问题。

BYOR

正确解析 XBase 类型名称(ARRAY、DATE、SYMBOL、USUAL 等)

现在可正确解决字面值问题(ARRAY、DATE、SYMBOL)

NULL_ 字面已正确解析(NULL_STRING 遵循 /vo2 编译器选项、NULL_DATE、NULL_SYMBOL)。

已启用 /vo14 编译器选项(浮点字面量)

编译器会自动在每个程序中插入 “Using Vulcan ”和 “using static VulcanRtFuncs.Functions”。

您必须在项目中添加对 VulcanRTFuncs 和 VulcanRT 程序集的引用。这可能是 Vulcan 3 和 Vulcan 4 版本的运行时。也许 Vulcan 2 也能运行,但我们没有测试过。

使用 Clipper 调用约定调用方法的效果符合预期。

没有返回类型的方法/函数被视为返回 USUAL

如果方法/函数包含类型化和类型化参数,那么未类型化的参数被视为 USUAL 参数

暂不支持仅包含非类型参数(Clipper 调用约定)的方法

? 命令将对参数调用 AsString()

 

Changes in 0.2.2

Visual Studio 集成

添加了更多项目属性。其中一个新属性是 “使用共享编译器” 选项。这将提高编译速度,但可能会产生副作用,即某些编译器(解析器)错误不会显示在详细信息中。
如果您遇到这种情况,请禁用该选项。

为生成系统添加了更多属性。现在,X# 也应支持所有 C# 属性,尽管其中一些在 VS 内部的属性对话框中不可见。

为生成系统添加了 CreateManifest 任务,因此包含托管资源的项目不会再出现错误

该版本的编辑器性能应该会更好。

将文本块标记为注释或取消标记并不总是在编辑器颜色中反应变化。这一问题已得到修复。

编译器

我们添加了第一版预处理器。该预处理器支持 #define 命令、#ifdef、#ifndef、#else、#endif、#include、#error 和 #warning。 目前还不支持 #command 和 #translate(添加用户定义的命令)。

缺少类型(参数列表、字段定义等)有时会产生不明确的错误信息。我们修改了编译器,使其产生 “缺少类型 ”的错误信息。

我们将 Roslyn 的底层代码推进到了 VS 2015 Update 1。虽然从外观上看不出什么变化<g>,但编译器中已经加入了一些修复和增强功能。

添加了 YIELD EXIT 语句(也可使用 YIELD BREAK)。

添加了 OVERRIDE 关键字(可选),该关键字可用作子类中被重载的虚方法的修饰符。

添加了一个 NOP 关键字,您可以在故意为空的代码(例如 case 语句的其他分支)中使用该关键字。如果在代码中插入 NOP 关键字,编译器将不再对空代码块发出警告。

OnOff 关键字可能会导致问题,因为它们不是位置关键字(它们是 pragma 语句的一部分)。这一问题已得到解决。

带有一个参数的 _AND()_OR() 表达式现在会引发编译器错误。

编译器现在可以识别 /VO14(将字面量存储为浮点数)编译器开关(尚未实施)。

添加了 ** 操作符作为 ^(指数)操作符的别名。

在字符串上使用减运算符时,添加了 “不支持 ”错误。

修正了编译器中的一个 “堆栈溢出” 错误,该错误可能会在很长的表达式中出现。

右移操作符不再与两个 “大于 ”操作符冲突,这使您可以声明或创建泛型,而不必在它们之间留出空格。
(var x := List<Tuple<int,int>>{}

 

Changes in 0.2.1

Visual Studio 集成

添加并改进了多个项目属性

修复 “附加编译器选项” 的问题

改进编辑器中关键词、注释等的颜色。你可以在 “工具/选项 ”对话框的 “常规/字体和颜色 ”下设置颜色。查找名称为 “XSharp"( 关键字)的条目。

已添加 Windows 窗体模板

编译器

若干错误已降级为警告,以便与 VO/Vulcan 更好地兼容

添加了对以星号开头的注释行的支持

已添加对 DEFINE 语句的支持。目前,DEFINE 语句的类型必须是
DEFINE WM_USER := 0x0400 AS DWORD

修正了反向 GET 和 SET 的单行属性问题

结合 /VO3 兼容性选项对虚方法和非虚方法进行了多项修复

 

Changes in 0.1.7

"ns"(为没有命名空间的类添加默认命名空间)已经实现

实现了 “vo3” 编译器选项(使所有方法都成为虚方法)。

修正了括号之间表达式的发送操作符编译不正确的问题

现在支持字符串的关系运算符(>, >=, <, <=)。它们使用 String.Compare() 方法实现。

修正了在 FOR ... NEXT 语句的起始行声明局部变量时出现的问题

添加了 CHM 和 PDF 格式的第一版文档

在 Visual Studio 项目属性对话框中添加了几个属性,以便设置新的编译器选项

修正了 MsBuild 使用的目标文件中的一个问题,因为某些标准宏(如 $(TargetPath))无法正常工作

包含 XIDE 0.1.7。该版本的 XIDE 完全使用 XSharp .NET 技术编译!

某些 MsBuild 支持文件的名称已更改。这可能会导致在加载 VS 项目时出现问题,如果你使用的是上一个版本中的 VS 支持文件的话。如果是这种情况,请在 Visual Studio 中编辑 xsproj 文件,并将 “XSharpProject ”的所有引用替换为 “XSharp”。然后确保 xsproj 文件的安全,并尝试重新加载项目

WHILE. ENDDO(没有前导 DO 的 DO WHILE)现在可以正确识别了

 

Changes in 0.1.6

该版本现在附带安装程序

该版本包含 Visual Studio 集成的第一个版本。您可以在 Visual Studio 中进行编辑、生成、运行和调试。没有 “intellisense ”功能。

编译器现在使用以 1 为基础的数组,“az ”编译器选项可将编译器切换为使用以 0 为基础的数组。

实现了 “vo2” 编译器选项(用 String.Empty 初始化字符串变量)。

请注意,VS 项目属性对话框中还没有 azvo2 编译器选项。您可以使用 “附加编译器选项 ”来指定这些编译器选项。

错误信息中的 “this ”和 “base ”已更改为 “SELF ”和 “SUPER”。

"可见性" 类型的错误(例如暴露 private 或 internal 类型的 public 属性)已改为警告

修正了 TRY ... ENDTRY 语句中不包含 CATCH 子句的问题

编译器现在可以更好地解决其他 (X#) 程序集中的函数问题

修正了一个问题,当混合使用不同的数字类型时,该问题可能会导致 “运算符不明确 ”的信息。

 

Changes in 0.1.5

当解析阶段出现错误时,X# 将不再进入编译器的后续阶段,以防止崩溃。除了解析器的错误外,还会显示错误 9002。

解析器错误现在也会在错误信息中包含源文件名,并采用与其他错误信息相同的格式。请注意,我们尚未完成对这些错误信息的处理。在即将推出的版本中,这些错误信息的格式将得到改进。

当程序使用 Xbase 类型(ARRAY、DATE、FLOAT、PSZ、SYMBOL、USUAL)之一时,编译器将显示 “功能不可用”(8022)错误。

修正了 VOSTRUCT 和 UNION 类型的一个错误

修正了感叹号 (!) NOT 运算符的一个问题

 

Changes in 0.1.4

允许使用整数和枚举进行计算的几处更改

为实现与 VO 兼容的 _OR、_AND、_NOT 和 _XOR 操作而做的几处修改

修复 interface/abstract VO 属性

只有在未明确声明的情况下,才插入隐式 "USING SYSTEM"

错误 0542 转为警告(成员名称不能与它们的封闭类型相同)

.XOR.表达式定义的变化

修复 CHAR_CONST 词法规则中的双引号

允许在类/结构等名称中声明命名空间(CLASS Foo.Bar)

修复在标识符名称为(位置)ACCESS 关键字时 access/assign 崩溃的问题

预处理器关键字无法在空格后识别,只能在行首识别。这一问题已得到解决。

防止属性 GET SET 被解析为表达式正文

修复接口事件的默认可见性

使用 /unsafe 选项时,不安全错误变为警告,PTR 为 void*

修复 dim 数组字段的声明

初步支持 VO cast 和 VO 转换规则(TYPE(_CAST, Expression) 和 TYPE(Expression))。_CAST 始终 unchecked(LONG(_CAST, dwValue)),而转换则遵循 checked/unchecked 规则(LONG(dwValue))

修复了参数列表为空的代码块问题

修复了 GlobalAttributes 的问题。

不带 GET SET 的 AUTO 属性现在会自动添加一个 GET 和 SET 块

允许隐式常量从 double 到 single 的转换

 

Changes in 0.1.3

将不一致的字段可访问性错误改为警告和其他类似错误

添加了对 Vulcan 参数的命令行支持。除非 Roslyn (C#) 编译器存在等效参数,否则这些参数不会再导致错误信息,但不会真正实现。例如 /ovf/fovf 都被映射到 /checked/wx 被映射到 /warnaserror 。不应使用 /w,因为其含义与 /warning level(警告级别)不同。而应使用 /nowarn:nnnn

修复了将 PUBLIC 修饰符分配给接口成员或析构函数的问题

防止表达式语句以 CONSTRUCTOR() 或 DESTRUCTOR() 开头

已添加对不带参数的 ? 语句的支持

如果未指定,赋值的默认返回类型现在是 VOID

已添加对 “旧风格”委托实例化的支持

添加了对枚举的支持

为 TRY ... END TRY(无 catch 和 finally)添加了隐式空 catch 块

在 LINQ 语句中添加了对 DESCENDING 关键字的支持

为 属性 和 事件添加了对 VIRTUAL 和 OVERRIDE 的支持

防止隐含覆盖插入抽象接口成员

修复了一个无法解析 System.Void 的问题

修复了 ACCESS/ASSIGN 属性生成的问题

修复了 Abstract 方法处理的问题

 

Changes in 0.1.2.1

添加了默认表达式

修复了与事件有关的问题

修复了一些小的词法问题

修复了 _DLL FUNCTION 和 _DLL PROCEDURE 的问题

 

Changes in 0.1.2

修复了处理扩展字符串中转义序列的问题

修复了 FOR... NEXT 语句中的问题

修复了 SWITCH 语句的一个问题

修复了 sizeof() 运算符的一个问题

修复了 REPEAT ... UNTIL 语句中的一个问题

修复了 TRY ... CATCH ... FINALLY ... END TRY 语句中的一个问题。

修复了条件访问表达式 ( Expr ? Expr) 中的问题

允许使用 args 类型访问名称的绑定成员

修复了包含多个 LOCAL 语句的 问题

修复了在编译不带主体的方法时使用调试信息的问题

优化了 Lexer。这将大大提高编译速度

修复了代码中的一个问题,该问题会报告一项功能尚不支持

修复了使用 STRUCTURE 约束条件定义泛型时出现的问题

编译器宏(__ENTITY__、__LINE__ 等)导致崩溃。现在,编译器会插入一个包含宏名称的字面字符串。

版本 0.1.1 不包含 XSC.RSP

修复了当标识符匹配(新)关键字时无法识别的问题