我继承了一个主要用VB编写的项目。我想保持我在VB中的功能,同时尽可能慢慢转换为C#。我发现这样做的唯一方法是创建一个单独的C#项目。但是,由于依赖性和引用,这会导致问题。我无法VBProject
引用CSharpProject
,反之亦然,因为它会创建循环引用。这是一个问题,因为我需要两个项目都能够引用另一个。有更好的方法可以做到这一点,还是我坚持用VB编写(或完全转换为C#)?
此外,这些项目也在同一个解决方案中。我不应该在不创建引用或其他更简单的方法的情况下导入/使用它们吗?
答案 0 :(得分:3)
没有必要删除循环引用。
当我在过去面临类似的情况时,从语言A转换为语言B,我开始重构语言A代码的位,以便它们独立于大多数代码库。然后我将这些孤立的部分翻译成语言B并进行集成,以便主程序现在依赖于新模块。最后,剩下的就是主程序。
需要时间,但这种自下而上的方法非常有效,我最终得到了一个更加模块化的程序。
答案 1 :(得分:2)
控制反转将帮助您大力执行此类迁移。当我被要求为未经测试的管道磁带VB.Net代码添加重要功能时,我最近解决了类似的问题。我想从VB.Net中提取现有的受影响的功能,并将其放在一个经过单元测试的C#程序集中。
如果要将类提取到新程序集但会导致原始程序集中的依赖关系,则可以通过在新程序集中定义一个由原始程序集中的依赖项实现的契约接口来否定这一点。 / p>
例如,在VB.Net程序集中给定了Alpha,Bravo和Charlie类,其中Alpha引用了Bravo。你想要提取Bravo,但它提到了Charlie。在C#项目中定义一个名为ICharlie的接口,其中包含Bravo关心的Charlie成员。在VB.Net项目中,修改Charlie:ICharlie。构造Bravo时,它将接受ICharlie类型的依赖项。
即使在同一个项目或一组项目中,这种方法的好处是可测试性。类之间的依赖关系是众所周知的,可以用模拟/存根替换,这样就可以测试像Bravo这样的类,而无需担心使用真正的ICharlie实现进行设置。
答案 2 :(得分:1)
当c#项目依赖于VB项目时,您将无法执行此操作。
您需要将VB.net项目中的类提取到c#项目中,以便类/函数是独立的,不依赖于VB项目。
这是我每天在工作中反对的事情,我正在慢慢走向光明(c#)
答案 3 :(得分:1)
如果你无法将特定项目提取到新的C#项目中来引用,那么你将不得不重写它。如果它是Web应用程序项目或Windows窗体项目,则无法在同一项目中维护任何类型的混合。如果您有一个网站项目,您可以为每个单独的页面指定语言,以便您拥有混合。但是,这非常麻烦,你会发现自己更好地分配时间在C#中重写它或者适应用VB编写。