拆分项目VB/C#和引用

拆分项目VB/C#和引用,c#,reference,project,language-translation,C#,Reference,Project,Language Translation,我继承了一个主要用VB编写的项目。我想保持我在VB中的功能,同时尽可能地慢慢转换为C。我发现要做到这一点,唯一的方法就是创建一个单独的C#项目。但是,由于依赖关系和引用,这会导致问题。我不能使用VBProject引用CSharpProject,反之亦然,因为它会创建循环引用。这是一个问题,因为我需要两个项目都能够引用另一个。有没有更好的方法来实现这一点,还是我一直在用VB编写(或者完全翻译成C#) 而且,这些项目都在同一个解决方案中。我不应该在不创建引用或其他更简单的方法的情况下导入/使用它们吗

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


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

当c#项目依赖于VB项目时,您将无法这样做

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


这是我每天在工作中都要面对的问题,我正在慢慢走向光明(c#)

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

不必删除循环引用

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


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

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

如果您希望将类提取到新程序集中,但会导致依赖关系返回到原始程序集中,则可以通过在新程序集中定义契约接口来否定这一点,该契约接口由来自原始程序集中的依赖关系实现

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


这种方法的好处是可测试性,即使在同一个项目或一组项目中也是如此。类之间的依赖关系是众所周知的,可以用mock/stub替换掉,这样就可以测试像Bravo这样的类,而不必担心用真正的ICharlie实现来设置它。

但是如果ICharlie在C#项目中,VB项目如何知道它呢?因为VB.Net项目引用了C#项目或者,如果您想让C#项目有一个对VB.Net项目的引用,您可以在VB.Net项目中定义一个接口IBravo,由Bravo(C#)实现。一般来说,我把它放在另一边。在C#程序集中,可能有六个或更多的接口为依赖项定义,但在现有VB代码中,您需要做的唯一更改是继承接口以公开现有的公共方法。