.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:
用C#写的一个类,编译到dll中,然后在VB.net中调用:

using System;

namespace CLSsample
{
 public class CLSTest
 {
  public CLSTest()
  {
   
  }
  public void ABC()
  {
   Console.WriteLine("ABC");
  }
 }
}

在VB.net中调用:
Dim c As CLSsample.CLSTest = New CLSsample.CLSTest
c.ABC()

现在给dll中的CLSTest类加一个函数:
public void abc()
{
 Console.WriteLine("abc");
}
先编译C#写的这个dll,再编译VB.net工程,编译出现问题,提示信息如下:

重载决策失败,原因是没有可访问的“ABC”最适合这些参数: 
    'Public Sub abc()': 不是最适合。
    'Public Sub ABC()': 不是最适合。
    
原因很简单,因为C#是区分大小写的,但是VB.net不区分。
而真正的原因在于用C#写的这个类是不符合CLS(公共语言规范)的。
现在在命名空间前面加上一句,标示编译时确保不包含其它语言无法使用的内容:
[assembly:CLSCompliant(true)]
namespace CLSsample
{
   ......
   public void ABC()
  {
       Console.WriteLine("ABC");
  }
   public void abc()
  {
       Console.WriteLine("abc");
  }
}
这时候再编译,就会出现错误,提示信息:
只在大小写不同的标识符“CLSsample.CLSTest.abc()”不符合 CLS

要编译通过,在函数abc前加上:
[CLSCompliantAttribute(false)]
指出 abc函数 是不符合 CLS 的

下面是MSDN中对CLS的部分说明:
CLS 在设计上足够大,可以包括开发人员经常需要的语言构造;同时也足够小,
大多数语言都可以支持它。此外,任何不可能快速验证代码类型安全性的语言
构造都被排除在 CLS 之外,以便所有符合 CLS 的语言都可以生成可验证的代码
(如果它们选择这样做)。

也就是说开发的类库必须遵守CLS才可以更好的被其它的语言所使用。否则就像
上面的情况,用C#开发的动态链接库在VB.net中就出现了问题,特别是开发一些
通用的类库的时候,就更需要注意这一点。

看看对.net framework中Int32反编译的部分结果(用的是Reflector):
[CLSCompliant(false)]
uint System.IConvertible.ToUInt32(IFormatProvider provider);
这是因为有的语言不支持UInt32类型。

再看看对UInt32反编译的结果,UInt32的声明:
[Serializable, StructLayout(LayoutKind.Sequential), CLSCompliant(false)]
public struct UInt32 : IComparable, IFormattable, IConvertible
{
}

什么是CLS? 
“CLS是编程语言设计者和类库设计者之间的一个约定”

       [ CLSCompliant(false)]
public void CreateItem(EnvDTE.DTE dte) {
this.creator.CreateDataAccessTechnologyObject(this, dte);
}

CLS(公共语言规范)的CLSCompliant(跨语言调用)的更多相关文章

  1. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  2. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

  3. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  4. 跨语言调用Hangfire定时作业服务

    跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...

  5. C++ 跨语言调用 Java

    C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...

  6. 使用thrift进行跨语言调用(php c# java)

    使用thrift进行跨语言调用(php c# java)   1:前言 实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端.其实除了本文提供的办法 ...

  7. vs2019 Com组件初探-简单的COM编写以及实现跨语言调用

    前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...

  8. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

  9. 跨语言调用C#代码的新方式-DllExport

    简介 上一篇文章使用C#编写一个.NET分析器文章发布以后,很多小伙伴都对最新的NativeAOT函数导出比较感兴趣,今天故写一篇短文来介绍一下如何使用它. 在以前,如果有其他语言需要调用C#编写的库 ...

随机推荐

  1. python并发编程-线程池

    from concurrent.futures import ThreadPoolExecutor import time def func(n): time.sleep(2) print(n) re ...

  2. 山东省第四届ACM程序设计竞赛A题:Rescue The Princess

    Description Several days ago, a beast caught a beautiful princess and the princess was put in prison ...

  3. [Codeforces #514] Tutorial

    Link: Codeforces #514 传送门 很简单的一场比赛打崩了也是菜得令人无话可说…… D: 一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可 此题 ...

  4. Codeforces 839E Mother of Dragons(极大团)

    [题目链接] http://codeforces.com/contest/839/problem/E [题目大意] 现在有一些点,现在你有k的液体,随意分配给这些点, 当两个点有边相连的时候,他们能产 ...

  5. [bzoj1016][JSOI2008]最小生成树计数 (Kruskal + Matrix Tree 定理)

    Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的 ...

  6. bzoj 3437: 小P的牧场 -- 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小P在MC里有n个牧场,自西向东呈一字形排列(自西向东用1…n编号), ...

  7. Django 中文显示

    Django中文显示: 1.如要在.py文件中显示中文,在文件首行加上:# -*- coding: utf-8 -*- 2.如要在html文件中显示中文,要将文件保存为UTF-8格式 3.在setti ...

  8. vCard : a file format standard for electronic business cards

    http://zh.wikipedia.org/wiki/VCard vCard是电子名片的文件格式标准.它一般附加在电子邮件之后,但也可以用于其它场合(如在互联网上相互交换). vCard可包含的信 ...

  9. WICED -- Wireless Internet Connectivity for Embedded Devices

    Broadcom's Wireless Internet Connectivity for Embedded Devices (WICED™) platform (pronounced "w ...

  10. react+redux+generation-modation脚手架搭建一个todolist

    TodoList 1. 编写actions.js 2. 分析state 试着拆分成多个reducer 3. 了解store 4. 了解redux数据流生命周期 5. 分析容器组件和展示组件 搞清楚,数 ...