规则

com组件以接口的方式对外开放。

1:所要导出的类必须为公有;
2:所有属性、方法也必须为公有;
3:要导出的属性、方法必须用接口方式;

interface IName
{
[DispId(1)]//为函数的标识:C#代码中必须定义了接口,才可以按照此方法实现调用。
void ShowAge(string age);
string Name { get; set; }
}

4、.net生成com组件只能提供给其他程序使用,例如java、 js、vbs等。  CLR拒绝导入.net 生成的com组件。因此在vs中无法使用 .net生成的com组件

5、必须将程序集设置为[assembly: ComVisible(true)]可见,其他程序才能调用组件中的函数
6、必须给每个类添加[ProgId("TestCom.Show")]注册表中的名称,空间+类名 记录到注册表中,给其他语言创建对象用

7、组件只有组成到全局缓存和注册表中后才能使用。

8、通过引用计数,组件对象自己负责动态创建与销毁,从而屏蔽了不同编程语言之间的内存分配语义差异

其他相关的内容请查看 microsoft.com

环境

我用的是C#10 vs2022 .net framework 4.72 类库

.net生成com组件只能提供给其他程序使用,例如java、 js、vbs等。  CLR拒绝导入.net 生成的com组件。因此在vs中无法使用 .net生成的com组件

设置

1、新建.net framework 4.7.2类库。

2、设置

3、设置签名

4、修改可见性

[assembly: ComVisible(true)]

或者 这两种方式是一样的。都是修改配置文件

5、生成GUID

C#代码:C#代码中必须定义了接口,才可以按照此方法实现调用。一定要写ProgId。

[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)]..... 

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace TestCom
{ [Guid("9A1EAE37-2698-466E-AC0C-0BDA1934A0E5")] interface IName
{
[DispId(1)]//为函数的标识:C#代码中必须定义了接口,才可以按照此方法实现调用。
string ShowAge(string age);
string Name { get; set; }
} [Guid("169B06D6-CFCC-4B65-B04F-8CB3B361A493")]
[ProgId("TestCom.Show")]//空间+类名 记录到注册表中,给其他语言创建对象用
public class Show : IName
{
public string Name { get; set; }
public string ShowAge(string age)
{
Console.WriteLine($"Age:{age}"); return age;
}
}
}

编译生成解决方案,Debug目录中会生成TestCom.dll文件

注:生成时平台必须使用x64,不然java会编译错误。

至此,代码就OK了。

com组成必须注册后才能用,以下是windows平台的com组件注册。

注册com组件

1、操作环境windows10+vs2022

cmd.exe位置在 C:\Windows\System32目录下,

以管理员的身份运行cmd.exe,然后输入以下命令进入gacutil.exe所在的文件夹。
cd /d C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64

2、注册全局缓存, 注册成功后,注册表就多一项记录。
gacutil -I "C:\Users\HP\source\repos\TestCom\TestCom\bin\Debug\TestCom.dll"
从全局缓存中卸载:gacutil -u TestCom  

3、 注册进注册表
 C:\Windows\WinSxS\x86_regasm_b03f5f7f11d50a3a_4.0.15788.0_none_b7e35132180143ba\RegAsm.exe C:\Users\HP\source\repos\TestCom\TestCom\bin\Debug\TestCom.dll
 
重注册表中卸载:RegAsm  /u
 C:\Windows\WinSxS\x86_regasm_b03f5f7f11d50a3a_4.0.15788.0_none_b7e35132180143ba\RegAsm.exe  /u C:\Users\HP\source\repos\TestCom\TestCom\bin\Debug\TestCom.dll

查看注册表regedit,HKEY_CLASSES_ROOT中是否有TestCom.Show项。如果有,则说明注册COM成功;如果没有,请重新注册

总结:自己编写程序生成的dll,用此法可注册。

通过 VBS 实现跨语言调用COM

1、打开记事本写入如下代码,然后把.txt 改成.vbs.

编写vbs代码 TestCom.Show为“Show类”设置的“ProgID”而ShowAge为类中的函数名

set com= CreateObject("TestCom.Show")
dim num
num=com.ShowAge("I am 14 ")
msgbox num

2、双击运行。

在vs2022环境中用C#创建COM组件的更多相关文章

  1. Ionic01 简单介绍、环境搭建、创建项目、项目结构、创建组件、创建页面、子页面跳转

    1 Ionic 基本介绍 Ionic 是一款基于 Angular.Cordova 的强大的 HTML5 移动应用开发框架 , 可以快速创建一个跨平台的移动应用.可以快速开发移动 App.移动端 WEB ...

  2. 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

    from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...

  3. vue.js开发环境搭建以及创建一个vue实例

    Vue.js 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 在使用 vue.js ...

  4. vue通过extend动态创建全局组件(插件)学习小记

    测试环境:nodejs+webpack,例子是看文章的,注释为自己的理解 创建一个toast.vue文件: <template> <div class="wrap" ...

  5. C#创建COM组件供VB,PB,Delphi调用

    1  COM组件概述 COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成 ...

  6. 开箱即用 yyg-cli(脚手架工具):快速创建 vue3 组件库和vue3 全家桶项目

    1 yyg-cli 是什么 yyg-cli 是优雅哥开发的快速创建 vue3 项目的脚手架.在 npm 上发布了两个月,11月1日进行了大升级,发布 1.1.0 版本:支持创建 vue3 全家桶项目和 ...

  7. HTML5 UI框架Kendo UI Web教程:创建自定义组件(三)

    Kendo UI Web包 含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在前面的2篇文章<HTML5 Web app开发工具Ke ...

  8. HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)

    在前面的文章<HTML5 UI框架Kendo UI Web自定义组件(一)>中,对在Kendo UI Web中如何创建自定义组件作出了一些基础讲解,下面将继续前面的内容. 使用一个数据源 ...

  9. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.1创建虚拟机

    2.1.创建虚拟机 2.1.1. 创建虚拟机节点1 2.1.2.  创建虚拟机节点2 操作如节点1. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境所有链 ...

随机推荐

  1. LINUX系统机器人

    简介 在2016年,国内的软硬件尚不能有效支撑我们制造智能机器人,我们无法有效在Linux进行语音唤醒,只能使用斯坦福大学狮身人面像语音开源项目来进行英文识别我们对RIMA的呼唤,抗干扰性为0,意味着 ...

  2. unity3d之sokect通信

    using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using S ...

  3. 搭建vps(virtual private station)之Github教育礼包之DigitalOcean

    最近Github联合很多业内厂商给出了一份学生礼包,可以用来做很多事情,其中包括Digital Ocean的100$优惠,用他可以架设自己的云服务器,选择每月5$套餐可获得512Mb内存20g固态硬盘 ...

  4. listen()和accept()

    1.listen()队列剖析 作用:监听端口,TCP连接中的服务器端角色 调用格式:int listen(int sockfd, int backlog); 第一个参数:创建的sockfd, 好好理解 ...

  5. Maven生命周期,插件,单元测试junit

    maven生命周期,maven命令,maven插件 maven生命周期:就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署 maven命令:maven独立使用,通过命令,完成mav ...

  6. SIFT Learing records

    目录 SIFT算法的步骤 小结 附录代码 花了一周的时间去读了一下SIFT的原论文,相关的一些视频还有文章,大体了解了其思想和步骤,在这里记录一下吧. SIFT是一种提取图像中具有尺度不变性的关键点的 ...

  7. AQS源码一窥-JUC系列

    AQS源码一窥 考虑到AQS的代码量较大,涉及信息量也较多,计划是先使用较常用的ReentrantLock使用代码对AQS源码进行一个分析,一窥内部实现,然后再全面分析完AQS,最后把以它为基础的同步 ...

  8. MAC OS 常用快捷键

    删除文件或文件夹 commond + delete 复制文件或文件夹 commond + c 粘贴文件或文件夹 commond + v

  9. linux修改root用户登陆密码

    如果不是以root用户登录的,请先切换到root用户下, 执行命令:su root 然后按提示输入root用户的密码. 英文系统: [root@localhost ~]# passwd Changin ...

  10. 模仿UIApplication单例

    要求:程序一启动就创建创建对象.创建的对象只能通过share的⽅方式获取对象.不能够进行alloc 操作,当执⾏行alloc时, 程序发生崩溃 1.程序一启动的时候就创建对象.当类被加载到内存的时候就 ...