最近工作须要接触了VB开发语言,但本身对VB并不相熟,因而理解了上面向.Net的多语言开发,在此记录下。

简介

.NET 是独立的语言。 这意味着,开发人员可应用面向.NET实现的多种语言(例如C#、F#和Visual Basic)进行开发。 可拜访针对 .NET 实现开发的类库的类型和成员,而不用理解它们的初始编写语言,也不用遵循任何原始语言的约定。如果你是组件开发人员,无论组件采纳哪种语言,均可由任何 .NET 利用拜访。(摘自微软官网文档)

本文次要形容C#与VB的共同开发,其它合乎CLS标准的语言相似。首先,C#与VB共同开发能够分两条路线探讨:

  1. 同一个我的项目中应用两种语言进行开发
  2. 同一个解决方案,不同我的项目应用不同语言进行开发

C#、VB共同开发

首先,两条路线都是可行的。对于1,在同一个我的项目中应用C#和VB开发意义不是很大,C#文件的后缀为.cs,VB文件的后缀为.vb,应用VS开发时须要进行编译设置或者手动编译,不是很不便。感兴趣的能够参考微软官网文档,本文次要介绍第二条路线。

第二条路线,即同一解决方案,不同我的项目别离应用C#、VB进行开发,并能够相互调用。C#和VB都是反对.Net的,都会被编译器编译为两头语言IL,这为C#、VB共同开发提供了可能。实现这个指标很简略,甚至无需任何配置,只须要创立一个解决方案,而后创立一个VB我的项目,一个C#我的项目,并增加援用,而后就能够实现相互调用。如下进行简略的测试:

class Program{    static void Main(string[] args)    {        double left = 3.5;        double right = 4.5;        var result = VBMath.Add(left, right);        Console.WriteLine($"调用VB库的Add办法:{result}");        Console.ReadLine();    }}public class CSharpMath{    public static double Add(double left, double right) => left + right;}
Module Program    Sub Main(args As String())        Dim left As Double = 3.5        Dim right As Double = 4.5        Dim result = CSharpMath.Add(left, right)        Console.WriteLine("调用C# Add办法:{0}", result)        Console.ReadLine()    End SubEnd ModulePublic Class VBMath    Public Shared Function Add(left As Double, right As Double) As Double        Return left + right    End FunctionEnd Class

上述测试胜利执行,能够看出C#和VB共同开发如此简略,不便了不同语言的程序员进行联合开发。然而,C#与VB毕竟是不同的语言,有些C#的个性VB不反对,反之,VB反对的某些个性C#也不反对。比方C#辨别大小写,VB不辨别。批改C#的CSharpMath类,如下:

public class CSharpMath{    public static double Add(double left, double right) => left + right;    public static uint TestCase = 1;    public static uint testCase = 2;}

在VB中进行调用:

Module Program    Sub Main(args As String())        ' 如下语句会报错:“TestCase”不明确,因为class“CSharpMath”中存在多种具备此名称的成员        Console.WriteLine("测试大小写:{0}", CSharpMath.TestCase)        Console.ReadLine()    End SubEnd Module

此时编译器报错:“TestCase”不明确,因为class“CSharpMath”中存在多种具备此名称的成员。这时,就须要理解CLS(公共语言标准)了。下述内容摘自微软官网文档:

为实现齐全互操作性情景,代码中创立的所有对象都必须依赖于应用它的语言(即其调用方)的某些共性。 因为存在多种不同语言,因而 .NET 在公共语言标准 (CLS) 中指定了这些共性。 CLS 定义了许多常见应用程序所需的一组性能。对于在.NET上实现的语言,它还就语言须要反对的内容提供了一组脚本。

CLS 是 CTS 的子集。 这意味着,CTS 中的所有规定也实用于 CLS,除非 CLS 规定更严格。 如果仅应用 CLS 中的规定生成组件(即在其 API 中仅公开 CLS 性能),则将该组件视为 合乎 CLS。 例如,<framework-librares> 完全符合 CLS,因为它们须要对 .NET 反对的所有语言无效。

因而,如果须要C#与VB共同开发,需注意合乎CLS规定,CLSCompliantAttribute个性能够标记元素是否合乎CLS,当不合乎时,编译器会收回正告。

CLSCompliantAttribute个性

CLSCompliantAttribute个性用于批示特定程序元素是否合乎公共语言标准(CLS),后者定义面向 .net 的任何语言所必须反对的性能。

能够将CLSCompliantAttribute个性利用于下列程序元素:程序集、模块、类、构造、枚举、构造函数、办法、属性、字段、事件、接口、委托、参数和返回值。然而,CLS听从性的概念仅实用于程序集、模块、类型和类型的成员,而不是成员签名的一部分。因而,CLSCompliantAttribute当利用于参数或返回值的程序元素时,将被疏忽。

如果程序集标记为合乎CLS,则必须应用参数标记程序集中任何不合乎CLS的公开类型CLSCompliantAttribute false。 同样,如果某个类标记为合乎CLS,则必须独自标记所有不合乎CLS的成员。

具体内容能够参考微软官网文档。如下进行CLSCompliantAttribute个性测试:

[CLSCompliant(true)] // 程序集也需增加该个性public class CSharpMath{    public static double Add(double left, double right) => left + right;    // 如下两行代码编译器会正告:类型不合乎CLS    public static uint TestCase = 1;    public static uint testCase = 2;}

当然并不是所有代码都须要合乎CLS,只须要将CLS合乎性规定利用于组件的公共接口,公有局部不用符合规范,即可设计与语言无关的组件。

另外,多语言开发或者还有另外一个思路,就是进行代码转换。