混合C#& VB在同一个项目中

时间:2009-08-14 14:01:14

标签: c# vb.net

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

我试过并且没有一个intellisense工作得很好,虽然后台编译器似乎处理得很好(除了我,然后,在同一名称空间中有两个类具有相同的名称,它没有抱怨)。

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

18 个答案:

答案 0 :(得分:121)

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

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

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

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

答案 1 :(得分:32)

嗯,实际上我几年前从同事那里继承了一个项目,该同事决定在同一个项目中混合VB和C#webforms。虽然有效,但维护起来并不是很有趣。

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

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

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

我在

中都引用了VB和C#编译器
<system.codedom>
    <compilers>

该项目目前已更新为框架3.5,它仍然有效(但仍然没有乐趣维护......)

答案 2 :(得分:20)

你不能在同一个项目中混合使用vb和c# - 如果你在visual studio中注意到项目文件是.vbproj或.csproj。你可以在解决方案中 - 在vb中有1个proj,在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 :(得分:12)

可能有一些自定义MSBuild开发。提供的.targets强制项目为单一语言 - 但没有运行时或工具限制阻止这一点。

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

这并不是一件轻而易举的事,但它可能会奏效。

答案 4 :(得分:7)

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

  

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

答案 5 :(得分:6)

查看此链接,该链接讨论了该问题,并展示了如何在.NET 4.0中的一个项目中组合VB和C#代码

http://msdn.microsoft.com/en-us/library/t990ks23.aspx

答案 6 :(得分:2)

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

答案 7 :(得分:2)

右键单击“项目”。选择Add Asp.Net Folder。 在“文件夹”下,创建一个名为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文件在剃刀中写出对象。

<p>@Model.FirstName</p>

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

答案 8 :(得分:2)

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

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

Step2:Project-&gt;添加之前添加的reference-&gt; dll或exe项目。

第3步:在vb.net表单中,你想使用c#forms-&gt; import project of project。

答案 9 :(得分:1)

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

答案 10 :(得分:1)

冒着回应所有其他答案的风险,不,你不能将它们混合在同一个项目中。

除此之外,如果您刚刚将VB转换为C#,为什么要在VB中编写新代码?

答案 11 :(得分:1)

                             

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

答案 12 :(得分:1)

我不知道如何使用C#编译器(或VB编译器)编译项目,而不是让编译器使用错误的语言。

将您的C#代码保存在与VB项目不同的项目中。您可以将这些项目包含在同一解决方案中。

答案 13 :(得分:1)

为什么不把你的VB代码编译成一个库(.dll)。稍后会从你的代码中引用它,就是这样。托管dlls包含MSILc#编译的vb

答案 14 :(得分:0)

正如其他人所说,你不能把两者放在一个项目中。但是,如果您只想将一小段C#或VB代码包含在另一种语言的项目中,则会自动conversion tools。他们并不完美,但他们做得很好。此外,SharpDevelop内置了转换实用程序。

答案 15 :(得分:0)

不,不在同一个项目中。但您可以在同一个解决方案中使用它们。 虽然您需要注意您的代码符合CLS。这意味着您不得使用其他语言无法理解的功能/功能。例如,VB不理解无符号整数。

答案 16 :(得分:0)

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

答案 17 :(得分:-1)

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