最近工作须要接触了 VB 开发语言,但本身对 VB 并不相熟,因而理解了上面向.Net 的多语言开发,在此记录下。
简介
.NET 是独立的语言。这意味着,开发人员可应用面向.NET 实现的多种语言(例如 C#、F# 和 Visual Basic)进行开发。可拜访针对 .NET 实现开发的类库的类型和成员,而不用理解它们的初始编写语言,也不用遵循任何原始语言的约定。如果你是组件开发人员,无论组件采纳哪种语言,均可由任何 .NET 利用拜访。(摘自微软官网文档)
本文次要形容 C#与 VB 的共同开发,其它合乎 CLS 标准的语言相似。首先,C# 与 VB 共同开发能够分两条路线探讨:
- 同一个我的项目中应用两种语言进行开发
- 同一个解决方案,不同我的项目应用不同语言进行开发
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 Sub
End Module
Public Class VBMath
Public Shared Function Add(left As Double, right As Double) As Double
Return left + right
End Function
End 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 Sub
End 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 合乎性规定利用于组件的公共接口,公有局部不用符合规范,即可设计与语言无关的组件。
另外,多语言开发或者还有另外一个思路,就是进行代码转换。