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


145

您可以在同一项目中为类库混合vb和c#文件吗?是否有一些设置可以实现?

我尝试过,尽管背景编译器似乎能很好地处理它,但所有intellisense都无法正常工作(除了我在相同名称空间中具有相同名称的2个类而且没有抱怨的事实之外)。

我们正在尝试从VB转换为C#,但尚未完成所有代码的转换。我有一些新代码需要编写,但实际上并不想为此创建一个新项目。


9
如果刚刚转换为C#,为什么还要在VB中编写新代码?
亚当·罗宾逊

顺便说一句,我认为有可能在两个不同的项目中使用部分类来实现混合方法,但是部分不能跨程序集,因此这也不起作用。
D. Lambert

堂,那是我的下一个尝试。
Wes P

1
修正了我的帖子。还没结束
Wes P

10
混合使用VB代码的原因之一是使用其独特的功能,例如,如果您使用的是LINQ to XML,则尤其要使用其XML功能。这样,您可以使用VB的动态XML语法,而不是编写root.Elements(“ Data”)中的from元素:'root。<Data>中的From元素。当工作了很多与XML文件这种语法可以将工作与比C#的要容易得多
李英健

Answers:


128

不,你不能。程序集/项目(每个项目通常编译为1个程序集)必须是一种语言。但是,您可以使用多个程序集,并且每个程序集都可以用不同的语言编码,因为它们都已编译为MSIL。

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

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

编辑:使用asp.net网站,您可以将c#Web用户控件添加到vb.net网站


1
事后有多种方法可以合并两个程序集,但这并不能解决该用户的问题。
Steven Sudit

是的,但是我不会因为混合语言的唯一目的而宽恕它。
Joel B Fant

我相信您可以在同一项目中混合使用托管和非托管c ++。
卡勒姆·罗杰斯

@C罗杰斯:这种情况完全是另一回事。如果需要,可以在同一源文件中混合托管和非托管C ++。但是它仍然与混合VB.NET和C#不同。
Joel B Fant

3
@DanHoward:哎呀,烧伤。那绝对是一个障碍,无法在同一项目中混合和匹配语言!

32

好吧,实际上,几年前我从一个同事那里继承了一个项目,该同事决定在同一项目中混合使用VB和C#Web表单。那行得通,但是维护起来却很有趣。

我决定新代码应该是C#类,要使其正常工作,我必须在web.config的编译部分添加一个子节点。

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

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

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

<system.codedom>
    <compilers>

该项目当前已更新到框架3.5,并且仍然有效(但仍然没有维护的乐趣。)


有关更多详细信息,请参见stackoverflow.com/questions/15711964/…–
约翰·约翰·

20

您不能在同一项目中混合使用vb和c#-如果您在Visual Studio中注意到项目文件是.vbproj或.csproj。您可以在解决方案中-在vb中有1个项目,在c#中有1个项目。

看起来像这样,您可以在App_Code目录的Web项目中同时使用它们:

http://pietschsoft.com/post/2006/03/30/ASPNET-20-Use-VBNET-and-C-within-the-App_Code-folder.aspx


3
拒绝投票,因为Project文件不是您无法从中生成程序集的原因。如果需要,可以使用命令行中的编译器来编译不存在Project文件的程序集。它不起作用的原因是(几乎总是)一个程序集来自一个编译器的一个编译工作。与项目文件无关。
汤姆W

8
赞成。从用户的角度来看,扩展名不同的想法是您不能/不希望看到的迹象。
4951

14

某些自定义MSBuild开发可能是可能的。提供的.targets强制项目使用单一语言-但是没有运行时或工具方面的限制。

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

并不是说这会是一件小事,但可能会奏效。


6
在灯架上有一个很好的写了由托马斯·科德宝在这里
戴夫M

1
的另一个示例可以在示例中找到张俊峰(Junfeng Zhang)的混合非托管C ++,C ++ / CLI和C#代码。在我的Visual Studio安装中首次运行。\ VC \ bin \ vcvars32.bat之后,它可能会正常工作。这实际上是在一个程序集而不是在一个项目中混合不同的语言。
R. Schreurs

7

演练:在网站项目中使用多种编程语言 http://msdn.microsoft.com/zh-cn/library/ms366714.aspx

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


2

尽管Visual Studio不支持此功能(您可以做一些技巧,让MSBuild编译两者,但不能从Visual Studio内部编译),但SharpDevelop可以。您可以将两者都放在同一个解决方案中(只要您正在运行Visual Studio Professional及更高版本),因此,如果要继续使用Visual Studio,最简单的解决方案是将VB代码分离到另一个项目中,并以这种方式进行访问。


1
ShartDevelop如何支持这一点?我只是试过了,它不能编译。有什么特别的事情需要做吗?
Epitka

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

是的,可能的。将c#和vb.net项目添加到一个解决方案中。

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

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

步骤3:以vb.net格式,您要使用c#格式->导入项目的名称空间。


1

我看不到如何用C#编译器(或VB编译器)编译项目,又如何避免使用错误的编译器语言。

将您的C#代码与VB项目放在一个单独的项目中。您可以将这些项目包含在同一解决方案中。


1

每种语言需要一个项目。我非常有信心看到一个合并了程序集的工具,如果您发现该工具,那就应该很好。如果您需要在同一类中使用两种语言,则应该能够在VB.net中编写一半的语言,然后通过继承VB.net类在C#中编写其余的语言。


1

冒着回显其他所有答案的风险,不能,您不能将它们混入同一项目中。

除此之外,如果您刚刚完成了将VB转换为C#的操作,为什么还要在VB中编写新代码?


2
因为您在我的帖子中发现了一个错误:)我们尚未完成转换。
Wes P

1

对于.net 2.0,此方法有效。如果您使用相关语言代码创建应用程序代码的子目录,则它确实会在同一项目中进行编译。到目前为止,我正在寻找它是否应该在3.5中工作。


1

为什么不只是将VB代码编译到library(.dll)中呢,以后再从代码中引用就可以了。托管dlls包含MSIL两者c#vb被编译。


2
如果您需要引用旧版VB.NET代码中的任何新C#代码,则将一无所获。反之亦然,无论您采用哪种方式,它都是单向引用。
罗曼·斯塔科夫

0

正如其他人所说,您不能将两者都放在一个项目中。但是,如果您只是想用另一种语言包含在项目中的一小段C#或VB代码,则可以使用自动转换工具。它们不是完美的,但它们做得很好。另外,SharpDevelop内置有一个转换实用程序。


就是那个 我可以吸收它并在VB中编写所需的代码,然后将其与其余内容一起转换。
Wes P

0

不,不在同一项目中,但是您可以在同一解决方案中使用它们。尽管您需要注意自己的代码符合CLS。这意味着您一定不能使用其他语言无法理解的功能。例如,VB不了解unsigned int。


0

在我们的方案中,它是单个解决方案中的单个VB.NET项目(Windows桌面应用程序)。但是,我们想利用C#功能,例如VB.NET中的有符号/无符号整数和XML文字以及字符串功能。因此,根据功能,在运行时我们将构建代码文件,使用各自的Rosalyn编译器(VB / CS)编译为DLL,然后动态加载到当前程序集中。当然,我们必须进行动态DLL的链接,卸载,重新加载,命名等工作,并且我们在很大程度上使用动态GUID进行命名以避免冲突,从而进行了内存管理。在应用程序用户可以从我们的桌面应用程序连接到任何数据库,编写SQL查询,将连接转换为LINQ连接以及编写LINQ查询的情况下,都可以很好地工作,所有这些都需要动态构建源代码,编译为DLL并附加到当前程序集。


-1

是的,您只能将两个文件都添加到网站中。如果项目是Web应用程序,则不允许使用其他类型的文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.