.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. Spring boot的hot swapping

    前言 嘛,都是看官方文档的,就先贴上文档地址: using-boot-hot-swapping 使用 使用hot swapping只需要把devtools的jar包添加到你的classpath里. 在 ...

  2. Hibernate对象的状态转换

    Hibernate中的实体对象可以分为三种状态:Transient(临时).Persistent(持久).Detached(游离) Transient 用new创建出对象,这些对象还没有与数据库发生任 ...

  3. 【BZOJ 3809】 3809: Gty的二逼妹子序列 (莫队+分块)

    3809: Gty的二逼妹子序列 Time Limit: 80 Sec  Memory Limit: 28 MBSubmit: 1728  Solved: 513 Description Autumn ...

  4. appengine 云计算。 部署web网络。

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha appengine 可以 不用手动启动像服务器. 在eclipse中 这两个sdk 配好 ...

  5. [bzoj1022][SHOI2008]小约翰的游戏 John (博弈论)

    Description 小约翰经常和他的哥哥玩一个非常有趣的游戏:桌子上有n堆石子,小约翰和他的哥哥轮流取石子,每个人取的时候,可以随意选择一堆石子,在这堆石子中取走任意多的石子,但不能一粒石子也不取 ...

  6. VK Cup 2016 - Round 1 (Div. 2 Edition) C. Bear and Forgotten Tree 3 构造

    C. Bear and Forgotten Tree 3 题目连接: http://www.codeforces.com/contest/658/problem/C Description A tre ...

  7. PAT甲级1033. To Fill or Not to Fill

    PAT甲级1033. To Fill or Not to Fill 题意: 有了高速公路,从杭州到任何其他城市开车很容易.但由于一辆汽车的坦克容量有限,我们不得不在不时地找到加油站.不同的加油站可能会 ...

  8. 为什么TCP连接需要三次握手分开需要四次握手?

    TCP的三次握手和四次断开TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建立连接,数据传输和终止连接3个过程,TCP建立连接的过程称为三次握手,下面 ...

  9. poj 3131 双向搜索+hash判重

    题意: 初始状态固定(朝上的全是W,空格位置输入给出),输入初始状态的空格位置,和最终状态朝上的位置,输出要多少步才能移动到,超过30步输出-1. 简析: 每一个格子有6种状态,分别是 0WRB, 1 ...

  10. localhost与127.0.0.1的区别 2

    localhost与127.0.0.1的区别localhost与127.0.0.1的区别是什么?相信有人会说是本地ip,曾有人说,用127.0.0.1比localhost好,可以减少一次解析.看来这个 ...