VB6 到 C#
基于 VB6 的 VB6 -> C# 2017 转换器。
用法
免费使用。免费分叉。免费贡献。免费询问。免费出售。以您自己的名义免费出售...可以自由地做任何事情,除了说我不能(参见许可证)。
请参阅下文了解基本信息。请参阅 Wiki 以获取更多详细信息。请随时联系寻求支持。
快速入门
- 打开文件
prj.vbp
,启动程序(需要 VB6 IDE)。 - 通过按钮在
Config
表单中输入一些配置值。 - 现在您已经选择了项目,请单击
SCAN
按钮。这有助于转换器了解不带括号的方法和变量/常量之间的区别。它还构建了完整的导入列表(可以通过 ^K^E 在 VS 2019 IDE 中清理)。 - 如果需要,请单击
SUPPORT
以生成基本项目支持结构。- 或者,可以直接从项目根目录复制文件
VBExtension.cs
和VBConstants.cs
并将其包含在其他位置。
- 然后,输入文件名并单击
Single File
以尝试转换您在其旁边输入的文件。
如果您想转换整个项目,只需单击ALL
,它将立即执行扫描、支持生成和整个项目转换。
注意:它可能不是最快的,它仍然需要手动操作,但它比全部手动完成要快!
更新2021-12-01
转换器的原始版本以逐块的方式解决该问题,将每个逻辑程序单元分离成自己的字符串并自行转换。结果,转换器进行了多次通过,基本上运行速度极其缓慢。将 linter 更新为不使用这种方法,而是简单地从上到下运行代码后,很明显,转换器可以以同样高的精度完成相同的操作。
因此,今天通过主窗体上的单选按钮发布了转换器的 v2,以及 v1。您可以随意混合搭配,用一个转换整个项目,然后用另一个转换单个文件。希望通过这两种完全不同的方法,其中一种会比另一种效果更好,并且会减少工作量。同样,它们的转化率仍然只有 80-90%。有很多事情您必须手动完成并仔细检查(例如循环边界),但同样,它肯定比将 VB6 代码中的所有&
更改为 C# 的+
更好。
我该如何...?
当谈到转换时,有很多问题。如果您只是想了解此转换器处理特定模式的方式,请参阅我如何...?我们的维基页面。
无论您是否使用此转换器,我们都会为常见的转换难题提供解决方案。我们的解决方案快速、切题,并且通常不会使用大量编程或上下文开销。虽然它们可能依赖于我们的扩展模块,但所有这些都是本机 C# 代码,并且通常与您在 VB6 中所做的非常相似。
要求
转换器要求
- 该转换器在 VB6 IDE 中运行。您知道,您要转换的程序的 IDE。
转换后的程序要求
- Visual Studio 支持一些相对现代的 C# 版本。或者交替。
- Visual Basic Power Packs/另一个链接/在 Repo 中提供,因为有时很难找到
- 允许直接在 C# 代码中使用标准 VB 函数,如
Mid
、 Trim
、 Abs
、 DateDiff
等。 - 确保与 VB6 功能 99.9% 兼容(
Format
除外),无需第 3 方黑盒库(它来自 MS,因此它是第 1 方黑盒)。 - 一旦转换并启动并运行,就可以轻松迭代。
指示
有关使用的更多信息,请参阅 wiki。
设计考虑因素
- 简单 - 并非旨在实现 100% 转换。也许只是 80% - 90% 的繁重工作。
- 基于 VB6 - 因为,为什么不呢?如果您要从 vb6 进行转换,则必须有一个可用的 VB6 编译器。
- 自定义 - 这是为个人项目创建的,因此是专门为我们的用例量身定制的。但是,没有任何理由说明有人不能调查逻辑并针对自己的任何问题进行调整。
- 机会主义 - 该代码严重依赖于 VB6 IDE 的相对一致性:
- 间距相对一致,因为 IDE 强制执行。
- 可以保证关键词大小写。
- 我们利用 Microsoft Power Pack,并且不需要转换大部分核心 VB6 语句。此外,您可以像在 VB 中一样继续使用
DateDiff
、 Left
、 Trim
等语句。或者,如果您愿意,可以在转换后开始迁移。我们只是引入 Microsoft 的库以获得最大兼容性,因此,没有大型字符串替换库,也不像某些转换器那样严重依赖我们自己的 DLL 或库(我们生成一些是为了简化语法,但最终结果是纯 C# 代码)。
- 非假设 - 它假设代码是在 VB 中编译的,因此它不会假设不会找到它无法解析的引用。
- 通用导入 - 导入每个代码模块,就像 VB6 自动执行的那样。让 Visual Studio 简单地通过优化转换后的导入来决定使用哪些文件。
- C# 2017 - 这是一个后来者。从来没有针对 VB6 -> C# 的免费软件解决方案,现在 VB.NET 或多或少已经停止使用,为什么不呢?
已知问题(仅限 v1)
- 目前,转换器通常会拒绝在其中任何位置包含“属性”一词的文件(属性声明除外)。虽然这是一个痛苦并且可能会被修复,但在项目实用性接近尾声时遇到了它(因此在修复列表上并不紧急),并且在它阻碍进展的地方,包含单词“...Property”的变量只是暂时重命名为“...Prppty”之类的名称,然后在转换后的文件中改回原来的名称。
- 这个问题已在版本 2 中得到解决,但在某些情况下,它可能仍会出现在 v1 中。
缺点
- 这不会生成以其生成形式进行编译的代码。最后一英里的自动化成本最高,而且通常最好手动完成。让某些东西充分发挥作用,并手动完成任何边缘情况或最终转换似乎更方便。
- 有限的 UI 定制(但无限的基于代码的定制)。这不是最可定制的解决方案。当然,除非您想深入了解转换器的一些源代码。但是,这就是它可用的原因。
- 无绒输出。从风格上看,生成的代码是一团糟。这就是现代 IDE 的用途。所有错误的格式都可以用 ^K^D 清除。未使用的导入带有 ^K^E。而且,您可能想要删除许多额外的 { 和 }。
- 目前转换器在循环边界方面确实很糟糕。抱歉,这是 VB6->C# 转换的陷阱之一,并且它的转换方式没有太多逻辑。这很乏味,但要在项目范围内搜索所有 for 循环并手动检查边界。
- 每个事件都有一个额外的方法。一张用于正确签名,一张用于原始签名。在大多数情况下,冗余是不必要的,但它提供了最简单的转换。在大多数情况下,这些可以简化为单一方法(但不是全部,这就是我不这样做的原因)。
注意:转换器知道的大多数地方都会出现问题,它会用// TODO:
注释来注释代码。请务必彻底解决其中的每一个问题。
优点
- 它是免费的。
- 你有源(定制它,无论如何)。
- 一次执行整个操作或仅执行一个文件。
- 这比全部手工完成要好得多。
- 它可以让您很好地了解正在发生的事情,而无需进行所有手动操作来进行简单的转换。
- 这不是最快的转换,但却是一种简单的转换(但 v2 变得更好了)。检查
ConvertSub
或ConvertPrototype
等函数。- 但想一想......您希望一次性进行转换,而不是在转换执行期间一遍又一遍地运行。
- 允许检查某些内容是如何转换的。不喜欢输出?改变它。
- 您可以在任意位置放置 VB6 断点并停止。此外,只需添加一行,
If LineN = 387 Then Stop
,转换器就会在那里停止。
附加功能
- VB6 代码检查器。
?Lint
。在开始这一过程之前就尽可能多地消除技术债务。 - VB6 表单到 XAML
未来的可能性
该项目基本上按原样进行。它发挥其作用。但是,需要注意一些事情,例如“扩展属性”。如果 C# 曾经实现过这个或类似的东西,那么转换.Visible = True
就会变得更加直接。因为 C# 现在使用枚举而不是布尔值,所以这是不可能的,但可以通过此功能实现。
接触
- 如果您确实有任何问题、疑虑,或者只是想要一些快速指导,请随时提出问题。我不能保证太多,但我会努力!