【问题标题】:Mixing C# & VB In The Same Project在同一个项目中混合使用 C# 和 VB
【发布时间】:2010-11-19 15:58:50
【问题描述】:

你可以在一个类库的同一个项目中混合vb和c#文件吗?有什么设置可以实现吗?

我试过了,但没有一个智能感知工作得很好,尽管后台编译器似乎处理得很好(除了事实上我在同一个命名空间中有两个同名的类,但它没有投诉)。

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

【问题讨论】:

  • 刚转换成C#为什么还要用VB写新代码?
  • 顺便说一句,我认为可以在两个不同的项目中使用部分类来实现混合方法,但是部分不能跨越程序集,所以这也行不通。
  • 混合 VB 代码的原因之一是使用其独特的功能,尤其是在使用 LINQ to XML 时它的 XML 功能。这样,您可以使用 VB 的动态 XML 语法,而不是编写 'from element in root.Elements("Data")':'From element In root.'。当大量使用 XML 文件时,这种语法比 C# 更容易使用
  • 我看到了你的辩论,我刚刚做了一个测试:我有一个网站,所有页面都是用 vb.net 编写的,代码在 app_code.. 等等。我刚刚添加了一个新页面代码 c#,我在 page_load 中做一些事情,它可以工作!没有错误没有什么。
  • @Edd 有趣的实验。与此问题中讨论的情况不同,即构建用于部署的类库 (.dll)。但仍然很有趣。

标签: c# vb.net


【解决方案1】:

我不明白如何使用 C# 编译器(或 VB 编译器)编译项目,并且不会因为编译器的错误语言而犹豫。

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

【讨论】:

    【解决方案2】:

    您不能在同一个项目中混合使用 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】:

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

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

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

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

    【讨论】:

    • 有办法在事后合并两个程序集,但这并不能解决这个用户的问题。
    • 没错,但我不会仅仅为了混合语言而容忍它。
    • 我相信您可以在同一个项目中混合托管和非托管 c++。
    • @C Rogers:这种情况完全不同。如果需要,您可以在同一个源文件中混合托管和非托管 C++。但还是和VB.NET和C#混在一起不一样。
    • @DanHoward:哎呀,烧了。这绝对是一个障碍,不能在同一个项目中混合和匹配语言!
    【解决方案4】:

    每种语言都需要一个项目。我很自信我看到了一个合并程序集的工具,如果你找到了那个工具,你应该很高兴。如果你需要在同一个类中使用两种语言,你应该可以用VB.net写一半,然后通过继承VB.net类用C#写剩下的。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

      • 就是这样。我可以把它吸起来,在 VB 中编写我需要的代码,然后用其他东西转换它。
      【解决方案6】:

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

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

      【讨论】:

      • 因为您在我的帖子中发现了一个错误 :) 我们还没有完成转换。
      • 因为您可能希望能够使用某些特定于语言的东西。比如内联 XML。或者不安全。或可选的参考。
      【解决方案7】:

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

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

      并不是说这将是一项微不足道的努力,但它可能会奏效。

      【讨论】:

      【解决方案8】:

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

      【讨论】:

      • ShartDevelop 如何支持这一点?我刚刚试了一下,它没有编译。有什么特别需要做的吗?
      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

        实际上,几年前我从一位同事那里继承了一个项目,他决定在同一个项目中混合使用 VB 和 C# 网络表单。这很有效,但维护起来并不有趣。

        我决定新代码应该是 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,它仍然可以工作(但维护起来仍然没有乐趣..)

        【讨论】:

        【解决方案11】:

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

        【讨论】:

        • 如果您需要从旧版 VB.NET 代码中引用任何新的 C# 代码,您将完全被填满。反之亦然,无论你走哪条路,它都只是单向引用。
        【解决方案12】:

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

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

        【讨论】:

          【解决方案13】:

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

          【讨论】:

            【解决方案14】:

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

            【讨论】:

              【解决方案15】:

              右键单击项目。选择添加 Asp.Net 文件夹。 在文件夹下,创建两个文件夹,一个命名为 VBCodeFiles,另一个命名为 Other 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" 是多余的。

              【讨论】:

                【解决方案16】:

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

                step1:文件->添加->现有项目

                Step2: Project->Add reference->你之前添加的项目的dll或exe。

                第三步:在 vb.net 表单中,您想使用 c# 表单->导入项目的命名空间。

                【讨论】:

                  【解决方案17】:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-18
                    • 2022-06-11
                    • 2014-01-28
                    相关资源
                    最近更新 更多