【问题标题】:Splitting a project VB/C#, and References拆分项目 VB/C# 和参考
【发布时间】:2010-12-20 22:52:01
【问题描述】:

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

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

【问题讨论】:

    标签: c# reference project language-translation


    【解决方案1】:

    不必删除循环引用。

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

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

    【讨论】:

      【解决方案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 实现来设置它。

      【讨论】:

      • 但是如果在C#项目中,VB项目怎么知道ICharlie呢?
      • 因为VB.Net项目有对C#项目的引用。或者,如果您希望 C# 项目具有对 VB.Net 项目的引用,您可以在 Bravo (C#) 实现的 VB.Net 项目中定义接口 IBravo。一般来说,我把它放在相反的位置。在 C# 程序集中可能为依赖项定义了六个或更多接口,但您需要在现有 VB 代码中进行的唯一更改是继承接口以公开现有的公共方法。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-18
          • 1970-01-01
          • 2011-01-24
          相关资源
          最近更新 更多