混合使用VB.net代码和C#代码

5

我有一个vb.net解决方案,我想添加一些用c#编写的新dll文件,并在vb.net中的代码中使用该dll的功能。

我已经多次尝试并且似乎都工作正常,但像我这样混合使用vb.net和c#代码是明智的吗?

我所做的事情有哪些危险性?

非常感谢您的帮助。

6个回答

11

你的 DLL 不是 C# DLL,而是 .NET DLL。一旦编译完成,所有你所拥有的都是 IL——无论它来自何种语言。这应该不会有问题,除非你遇到其中一个奇怪的边缘情况,其中 DLL 的接口包括某些不受 Visual Basic 支持的内容。但这将是非常罕见的边缘情况。

公共语言规范(CLS)定义了必须由 .NET 语言支持的 .NET 特性的子集,如果你的 DLL 符合 CLS,则可以无问题使用它。如果你对 CLS、CTS、CLR 等之间的区别感到困惑,我觉得这本书 中的相关介绍很有帮助,尽管它主要是一本 C# 书。


OP正在询问是否这样做是正确的,因为它已经有了语言混合的情况。 - Rubens Farias
1
这是95% - 99.99%的真实性,但不是100%的真实性。这就是为什么有一个公共语言规范(Common Language Specification)。将DLL标记为CLS兼容,这应该可以百分之百地确保您可以从任何CLS语言(例如VB.Net)调用它。https://dev59.com/yEvSa4cB1Zd3GeqPe35X#2117937 - MarkJ
@Mark - 谢谢,我今天显然状态不佳。可能这就是我没去上班的原因。无论如何,我已经编辑了答案。 - David M
我发现你的回答也非常详细,给你点赞。 - David M

5
将您的代码标记为CLS兼容,然后C#编译器会警告您如果您做了任何可能在从另一个 .Net 语言调用您的DLL时引起问题的事情。
以下是MSDN上的一些引用:
为了能够与其他对象进行完全交互,无论它们是用哪种语言实现的,对象必须向调用者公开仅适用于所有需要互操作的语言的共同特征。因此,定义了公共语言规范(CLS),它是许多应用程序所需的基本语言特性的集合。
您可以使用CLSCompliantAttribute将程序集、模块、类型和成员标记为CLS兼容。
一些CLS兼容的语言编译器,例如C#编译器,使您能够指定您打算使代码符合CLS。这些编译器可以检查CLS兼容性并在您的代码使用不受CLS支持的功能时通知您。
此外,您的组织现在需要具备C#技能和Vb.Net技能。您应该确信这是可以接受的,然后说服关键决策者。

3

您可以在同一个项目中混合使用VB和C#代码——我曾经参与过几个这样的项目,它们混合使用了VB和C#代码,没有出现任何问题。

您的语言混合似乎更加孤立——一个解决方案具有多个C# DLL和VB项目。

我认为这种方式不会出现太多问题。


6
你是说“相同的解决方案”吧?把多个项目混在一起是行不通的。 - Hans Passant
在同一个项目中使用两种语言是可能的,但不能在同一个文件中。 - Raj More
你们能否提供一些关于如何在同一个项目中混合使用C#和VB文件的链接或参考资料? - Viku

1

这里找到了一个解决方案here

然而,在一个项目中使用不同的编程语言是可能的。您可能需要编写命令行构建文件来构建项目。在.NET框架SDK中,有一个关于此的示例。您可以在C:\ Program Files \ Microsoft Visual Studio .NET \ FrameworkSDK \ Samples \ Technologies \ CrossDevLanguage中访问它。
该示例演示了在单个项目中使用不同的开发语言。该示例创建了两个程序集。第一个是库或DLL程序集,其中定义了一个使用托管C ++扩展编写的简单基类。第二个程序集是可执行程序集,其中定义了三个派生类,分别用C#,VB和IL(中间语言)编写。这些类型彼此派生,并最终从使用托管C ++编写的基类派生。最后,可执行文件创建每个派生类型的实例,并为每个调用虚拟方法。.NET Framework是一个环境,在这个环境中,各种开发人员可以无缝地协同工作,同时使用他们选择的语言进行开发。
但是您可以在asp.net应用程序中同时使用VB.NET和C#代码。

您需要在App_Code文件夹中创建两个文件夹(例如vbFolder和csFolder),并在web.config中编写以下代码:

<system.web>    
<compilation>    
<CODESUBDIRECTORIES>    
<ADD directoryName="vbFolder" />    
<ADD directoryName="csFolder" />    
</CODESUBDIRECTORIES>    
</compilation>    
</system.web>  

这里有一个很好的解释链接


0

我认为最大的危险是让开发人员了解两种语言;虽然C#和VB.NET很相似,因为它们都绑定在.NET框架上,但它们有一些特殊之处。

你会发现有很多优秀的C#程序员和VB.NET程序员,但是要找到一个精通两种语言的好程序员可能会有点困难。

此外,请查看这篇文章:管理者对C#与VB.NET决策的回顾,因为它谈到了其他需要注意的事项,如开发人员偏好、语言特性和招聘。


不是我,也不是其他程序员在那个项目上工作,完全不知道VB语言。因此,我们真的想转移到C#。 - Night Walker
你可以继续使用你已经在用的VB.NET程序集,并试着争取时间和老板一起创建一个使用单一编程语言的解决方案,从而提高生产力。 - Rubens Farias

0

VB.NET和C#都编译为MSIL(Microsoft Intermediate Language)而不是本机代码,因此需要通过现有的.NET框架在最终用户机器上完整编译为本机(机器)代码,这个框架已经存在于最终用户的机器上,所以如果它是操作系统x的.NET,您的程序应该可以在操作系统x上正常工作;如果是操作系统y,您的应用程序应该可以在操作系统y上正常工作,这就是.NET技术所带来的解决方案,使.NET应用程序操作系统无关。

此外,还有一个COM Marshaler服务来支持旧组件(控件)与.NET应用程序一起使用,例如,您可以在C#窗体应用程序中调用vb6控件(*.ocx)。

这是微软技术和技巧之间的很好的集成。

没有必要让开发人员精通VB.NET和C#,但是如果您需要其中的一个,我在这里:)

但问题是为什么我两个都会?

这只是因为我提供培训,所以我想扩展我的能力,我惊讶地发现它们非常接近,除了语法。


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