在同一项目中混合使用C#和VB

169

在一个类库项目中,您能否混合使用VB和C#文件?是否有某些设置可以实现这一点?

我尝试过,但智能感知功能并不完全正确,尽管后台编译器似乎处理得足够好(除了我在同一命名空间中有两个同名类的事实,它没有抱怨)。

我们正在尝试从VB转换到C#,但是还没有完成所有代码的转换。我需要编写一些新代码,但真的不想为此创建一个新项目。


9
如果你已经转换成C#,为什么还要用VB写新代码? - Adam Robinson
11
其中混合VB代码的原因之一是利用其独特功能,特别是在使用LINQ to XML时使用其XML功能。这样,你可以使用VB的动态XML语法来代替编写'from element in root.Elements("Data")',例如:'From element In root.<Data>'。当需要大量处理XML文件时,这种语法比C#更易于使用。 - Marchy
我看到了你的辩论,我刚刚做了一个测试:我的网站所有页面都是用vb.net编写的,代码在app_code中。我刚刚添加了一个新页面,使用c#编写代码,在page_load中进行操作,它可以正常工作!没有错误,没有任何问题。 - Edd
@Edd 有趣的实验。这与本问题讨论的构建类库(.dll)进行部署的情况不同,但仍然非常有趣。 - ToolmakerSteve
顺便提一下,我看到有几个答案(在问题发布多年后仍在添加)提到了ASP.Net的解决方案。这些解决方案与上面的标题一致 - 但这与“用于类库项目”的问题不同,正如问题所问。被接受的答案对于所提出的问题是正确的。 - ToolmakerSteve
显示剩余2条评论
17个回答

136

不行。一个程序集/项目(通常每个项目都会编译成一个程序集)必须是一种语言。然而,你可以使用多个程序集,每个程序集都可以使用不同的语言编写,因为它们都被编译为CIL。

它编译得很好,没有抱怨,因为VB.NET项目只会实际编译.vb文件,而C#项目只会实际编译.cs文件。它忽略了其他文件,因此你没有收到错误。

编辑:如果将一个.vb文件添加到一个C#项目中,在解决方案资源管理器面板中选择该文件,然后查看属性面板,你会注意到生成操作是“内容”,而不是“编译”。它被视为简单的文本文件,甚至不会作为二进制资源嵌入到编译后的程序集中。

编辑:在asp.net网站中,你可以将c# web用户控件添加到vb.net网站中。


1
有办法在事后合并两个程序集,但这并不能解决这位用户的问题。 - Steven Sudit
没错,但我不会为了混合语言而支持这样做。 - Joel B Fant
我相信你可以在同一个项目中混合使用托管和非托管的C++。 - Callum Rogers
@C Rogers:那种情况完全不同。如果您愿意,可以在同一源文件中混合使用托管和非托管的C++。但这仍然不同于混合使用VB.NET和C#。 - Joel B Fant
这并不是严格的情况,但这是Visual Studio和MSBuild的配置方式。 - Scott Weinstein
5
哎呀,糟糕了。这绝对是一个限制,不能在同一个项目中混用语言! - user1228

34

实际上,几年前我从一个同事那里接手了一个项目,他决定将VB和C# WebForms混合在同一个项目中。虽然这样做可以运作,但维护起来很不方便。

我决定新的代码应该是C#类,并为了让它们工作,我必须在web.config的编译部分添加一个子节点。

        <codeSubDirectories>
            <add directoryName="VB"/>
            <add directoryName="CS"/>
        </codeSubDirectories>

所有的VB代码放在名为VB的App_Code子文件夹中,C#代码放在CS子文件夹中。这将产生两个.dll文件。它可以工作,但是代码按照“codeSubDirectories”中列出的顺序编译,因此如果在C#和VB中都使用接口,则接口应放在VB文件夹中。

我同时引用了VB和C#编译器。

<system.codedom>
    <compilers>

该项目目前已更新到3.5框架,并且仍然可以工作(但维护起来并不轻松..)


请参阅https://dev59.com/rHDXa4cB1Zd3GeqP-05I以获取更多详细信息。 - John

22

3
因为项目文件并不是导致您无法从中生成汇编文件的原因,所以被人踩了。如果您想要的话,可以在没有项目文件的情况下使用命令行编译器编译汇编文件。而它不能工作的原因是一个程序集几乎总是由一个编译器的一次编译任务完成的。这与项目文件无关。 - Tom W
9
点赞。从用户的角度来看,扩展程序不同的想法是你不能做到某事的明显标志。 - user4951

15

可能需要进行一些自定义的MSBuild开发。提供的 .targets 强制项目为单语言-但是没有运行时或工具限制来阻止此操作。

VB和CS编译器都可以输出到模块-CLR的版本.obj文件。使用程序集链接器,您可以获取VB和CS代码的模块并生成一个单一程序集。

虽然这不是一项轻松的工作,但它可能会起作用。


6
这里有一篇由Thomas Freudenberg撰写的好文章,可以在这里阅读(http://thomasfreudenberg.com/blog/archive/2006/08/22/Mixing-C_2300_-and-VB.NET-in-one-assembly.aspx)。 - Dave M
1
另一个例子可以在Junfeng Zhang的示例:混合非托管C++、C++/CLI和C#代码中找到。在我的Visual Studio安装中首先运行.\VC\bin\vcvars32.bat后,它可以正常工作。这实际上是将不同语言混合在一个程序集中而不是在一个项目中。 - R. Schreurs
Thomas Freudenberg的帖子更新链接在这里:https://thomasfreudenberg.com/archive/2006/08/21/mixing-c-and-vb-net-in-one-assembly/。 - Borislav Ivanov

7

教程:在网站项目中使用多种编程语言 http://msdn.microsoft.com/en-us/library/ms366714.aspx

默认情况下,App_Code文件夹不允许使用多种编程语言。但是,在网站项目中,您可以修改文件夹结构和配置设置以支持多种编程语言,例如Visual Basic和C#。这样,ASP.NET就可以创建多个程序集,每个程序集对应一种编程语言。有关更多信息,请参阅ASP.NET Web项目中的共享代码文件夹。开发人员通常在Web应用程序中包含多种编程语言,以支持独立运作且偏好不同编程语言的多个开发团队。


4

是的,这是可能的。可以将C#和VB.NET项目添加到单个解决方案中。

步骤1:文件-> 添加-> 现有项目

步骤2:项目-> 添加引用-> 添加之前添加的项目的dll或exe。

步骤3:在VB.NET窗体中,您想要使用C#窗体->导入该项目的命名空间。


当你有太多混合项目时,就会出现问题,然后你会得到一个循环引用,它不允许你添加所需的内容。 - Brain2000

2

右键单击项目,选择“添加Asp.Net文件夹”。 在该文件夹下创建两个文件夹,一个命名为VBCodeFiles,另一个命名为CSCodeFiles。 在Web.Config中,在编译选项下添加一个新元素。

<compilation debug="true" targetFramework="4.5.1">
      <codeSubDirectories>
        <add directoryName="VBCodeFiles"/>
        <add directoryName="CSCodeFiles"/>
      </codeSubDirectories>
</compilation>

现在,创建一个cshtml页面。 使用以下代码将VBCodeFiles.Namespace.MyClassName添加为引用:
@using DMH.VBCodeFiles.Utils.RCMHD
@model MyClassname

在上面的命名空间中找到一个类对象MyClassName。 现在使用cshtml文件在razor中编写该对象。

<p>@Model.FirstName</p>

请注意,如果这是一个C#项目,则directoryName="CSCodeFiles"是多余的;如果这是一个VB.Net项目,则directoryName="VBCodeFiles"是多余的。

2
为什么不将你的VB代码编译成一个库(.dll)。然后从你的代码中引用它就可以了。托管的dll包含MSIL,这是c#和vb都可以编译的。

3
如果你需要从传统的VB.NET代码中引用任何新的C#代码,或者反过来,无论你选择哪种方式,都只能进行单向引用,否则你将会完全陷入困境。 - Roman Starkov

2

虽然Visual Studio不支持这种操作(你可以使用一些技巧,让MSBuild编译两者,但不能从Visual Studio内部进行),SharpDevelop可以。只要你运行的是Visual Studio专业版及以上版本,你就可以将两者放在同一个解决方案中。因此,如果你想继续使用Visual Studio,最简单的解决方法是将VB代码分离到另一个项目中,然后以这种方式访问它。


1
SharpDevelop如何支持这个?我刚试了一下,它无法编译。需要做什么特别的吗? - epitka

1

对于 .net 2.0,这个方法是有效的。如果你在应用程序代码中创建相关语言代码的子目录,它可以在同一个项目中编译。但我还不确定它是否适用于3.5。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接