面向.Net的多語言開發


最近工作需要接觸了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 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。 例如, 完全符合 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符合性規則應用於組件的公共接口,私有部分不必符合規范,即可設計與語言無關的組件。

另外,多語言開發或許還有另外一個思路,就是進行代碼轉換。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM