熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows優化 >> 正文

關於“跨語言調用”和“CLS(公共語言規范)”

2022-06-13   來源: Windows優化 

 的一個很重要的特性就是跨語言的編程用C#寫的dll可以在裡調用例如
  用C#寫的一個類編譯到dll中然後在中調用
  
  using System;
  
  namespace CLSsample
  {
   public class CLSTest
   {
   public CLSTest()
   {
   
   }
   public void ABC()
   {
    ConsoleWriteLine(ABC);
   }
   }
  }
  
  在中調用
  Dim c As CLSsampleCLSTest = New CLSsampleCLSTest
  cABC()
  
  現在給dll中的CLSTest類加一個函數
  public void abc()
  {
   ConsoleWriteLine(abc);
  }
  先編譯C#寫的這個dll再編譯工程編譯出現問題提示信息如下
  
  重載決策失敗原因是沒有可訪問的ABC最適合這些參數:
    Public Sub abc(): 不是最適合
    Public Sub ABC(): 不是最適合
    
  原因很簡單因為C#是區分大小寫的但是不區分
  而真正的原因在於用C#寫的這個類是不符合CLS(公共語言規范)的
  現在在命名空間前面加上一句標示編譯時確保不包含其它語言無法使用的內容
  [assembly:CLSCompliant(true)]
  namespace CLSsample
  {
   
    public void ABC()
   {
      ConsoleWriteLine(ABC);
   }
    public void abc()
   {
      ConsoleWriteLine(abc);
   }
  }
  這時候再編譯就會出現錯誤提示信息
  只在大小寫不同的標識符CLSsampleCLSTestabc()不符合 CLS
  
  要編譯通過在函數abc前加上
  [CLSCompliantAttribute(false)]
  指出 abc函數 是不符合 CLS 的
  
  下面是MSDN中對CLS的部分說明
  CLS 在設計上足夠大可以包括開發人員經常需要的語言構造同時也足夠小
  大多數語言都可以支持它此外任何不可能快速驗證代碼類型安全性的語言
  構造都被排除在 CLS 之外以便所有符合 CLS 的語言都可以生成可驗證的代碼
  (如果它們選擇這樣做)
  
  也就是說開發的類庫必須遵守CLS才可以更好的被其它的語言所使用否則就像
  上面的情況用C#開發的動態鏈接庫在中就出現了問題特別是開發一些
  通用的類庫的時候就更需要注意這一點
  
  看看 framework中Int反編譯的部分結果(用的是Reflector):
  [CLSCompliant(false)]
  uint SystemIConvertibleToUInt(IFormatProvider provider);
  這是因為有的語言不支持UInt類型
  
  再看看對UInt反編譯的結果UInt的聲明
  [Serializable StructLayout(LayoutKindSequential) CLSCompliant(false)]
  public struct UInt : IComparable IFormattable IConvertible
  {
  }
  
  在前陣子的一個隨筆什麼是CLS?
  CLS是編程語言設計者和類庫設計者之間的一個約定
  現在體會得更深了
  
  剛開始系統學框架有錯誤的地方還請大家不吝賜教
From:http://tw.wingwit.com/Article/os/youhua/201311/10694.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.