2

我继承了一个主要用 VB 编写的项目。我想保持我在 VB 中拥有的东西,同时尽可能慢慢地转换为 C#。我发现这样做的唯一方法是创建一个单独的 C# 项目。但是,由于依赖关系和引用,这会导致问题。我不能有VBProject引用CSharpProject,反之亦然,因为它会创建一个循环引用。这是一个问题,因为我需要两个项目能够引用另一个。有没有更好的方法来做到这一点,还是我坚持用 VB 编写(或完全翻译成 C#)?

此外,这些项目在同一个解决方案中。我不应该能够在不创建参考或其他更简单方法的情况下导入/使用它们吗?

4

4 回答 4

3

不必删除循环引用。

当我过去遇到类似的情况,从语言 A 转换到语言 B 时,我首先重构了语言 A 代码的一些部分,以便它们独立于大部分代码库。然后我会将这些孤立的部分翻译成语言 B 并进行集成,以便主程序现在依赖于新模块。最终,剩下的就是主程序。

这需要时间,但这种自下而上的方法非常有效,我最终得到了一个更加模块化的程序。

于 2010-12-20T22:58:27.917 回答
2

控制反转将极大地帮助您执行这样的迁移。当被要求向未经测试的胶带 VB.Net 代码添加重要功能时,我最近解决了一个类似的问题。我想从 VB.Net 中提取现有的受影响功能并将其放入经过单元测试的 C# 程序集中。

如果您想将一个类提取到新程序集但会导致原始程序集中的依赖关系,您可以通过在新程序集中定义一个合同接口来否定这一点,该接口由原始程序集的依赖项实现。

例如,给定 VB.Net 程序集中的类 Alpha、Bravo 和 Charlie,其中 Alpha 引用了 Bravo。您想提取 Bravo,但它引用了 Charlie。在 C# 项目中定义一个名为 ICharlie 的接口,其中包含 Bravo 关心的 Charlie 中的成员。在 VB.Net 项目中,修改 Charlie : ICharlie。当您构造 Bravo 时,它将接受 ICharlie 类型的依赖项。

即使在同一个项目或一组项目中,这种方法的好处是可测试性。类之间的依赖关系是众所周知的,可以用模拟/存根代替,这样就可以测试像 Bravo 这样的类,而无需担心使用真正的 ICharlie 实现来设置它。

于 2010-12-21T00:24:11.333 回答
1

当 c# 项目依赖于 VB 项目时,您将无法执行此操作。

您需要将 VB.net 项目中的类提取到 c# 项目中,以便类/函数是独立的,不依赖于 VB 项目。

这是我每天在工作中与之斗争的事情,我正在慢慢走向光明(c#)

于 2010-12-20T22:56:11.700 回答
1

如果您无法将特定项目提取到新的 C# 项目中以供参考,那么您将不得不全部重写。如果它是 Web 应用程序项目或 Windows 窗体项目,则不能在同一个项目中维护任何类型的混合。如果您有一个网站项目,您可以为每个单独的页面指定语言,这将允许您进行混合。但是,这非常混乱,您会发现分配时间用 C# 重写它或适应用 VB 编写要好得多。

于 2010-12-20T22:57:23.147 回答