在vs2022环境中用C#创建COM组件
规则
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、通过引用计数,组件对象自己负责动态创建与销毁,从而屏蔽了不同编程语言之间的内存分配语义差异
环境
我用的是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组件的更多相关文章
- Ionic01 简单介绍、环境搭建、创建项目、项目结构、创建组件、创建页面、子页面跳转
1 Ionic 基本介绍 Ionic 是一款基于 Angular.Cordova 的强大的 HTML5 移动应用开发框架 , 可以快速创建一个跨平台的移动应用.可以快速开发移动 App.移动端 WEB ...
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...
- vue.js开发环境搭建以及创建一个vue实例
Vue.js 是一套构建用户界面的渐进式框架.Vue 只关注视图层, 采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 在使用 vue.js ...
- vue通过extend动态创建全局组件(插件)学习小记
测试环境:nodejs+webpack,例子是看文章的,注释为自己的理解 创建一个toast.vue文件: <template> <div class="wrap" ...
- C#创建COM组件供VB,PB,Delphi调用
1 COM组件概述 COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术.在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成 ...
- 开箱即用 yyg-cli(脚手架工具):快速创建 vue3 组件库和vue3 全家桶项目
1 yyg-cli 是什么 yyg-cli 是优雅哥开发的快速创建 vue3 项目的脚手架.在 npm 上发布了两个月,11月1日进行了大升级,发布 1.1.0 版本:支持创建 vue3 全家桶项目和 ...
- HTML5 UI框架Kendo UI Web教程:创建自定义组件(三)
Kendo UI Web包 含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在前面的2篇文章<HTML5 Web app开发工具Ke ...
- HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)
在前面的文章<HTML5 UI框架Kendo UI Web自定义组件(一)>中,对在Kendo UI Web中如何创建自定义组件作出了一些基础讲解,下面将继续前面的内容. 使用一个数据源 ...
- 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.1创建虚拟机
2.1.创建虚拟机 2.1.1. 创建虚拟机节点1 2.1.2. 创建虚拟机节点2 操作如节点1. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境所有链 ...
随机推荐
- 使用Cesium Stories来可视化时序数据
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium可以用来可视化随时间变化的数据,无论是跨越数百年的地 ...
- HttpServletResponse接口详解
在 Servlet API 中,定义了一个 HttpServletResponse 接口,它继承自 ServletResponse 接口.HttpServletResponse 对象专门用来封装 HT ...
- gin中如何自定义验证器
package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding&qu ...
- IDEA中导入Maven工程(module)
导入其它Maven工程时可能会出现依赖代码变红等等可以重新导入 右键pom.xml文件 --->Maven---->Reimport ,idea强制刷新内容,一般能解决依赖没有识别的问题 ...
- 【故障公告】数据库服务器 CPU 100% 引发全站故障
今天 11:12-12:03 期间,园子使用的阿里云 RDS 实例(SQL Server2016 标准版,16核CPU)出现 CPU 100% 问题,引发全站故障,由此给您带来麻烦,请您谅解. 发现故 ...
- ApacheCN Linux 译文集(二) 20211206 更新
CentOS7 Linux 服务器秘籍 零.前言 一.安装 CentOS 二.配置系统 三.管理系统 四.用 YUM 管理包 五.管理文件系统 六.提供安全性 七.构建网络 八.使用文件传输协议 九. ...
- C# 实例解释面向对象编程中的单一功能原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- java-swing-事件监听-焦点监听器
感谢大佬:https://blog.csdn.net/weixin_44512194/article/details/93377551 开始不知道焦点是啥,其实就是打字的时候,这个一闪一闪的竖线. 与 ...
- V8 内存管理和垃圾回收机制总结
这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...
- 动态修改UINavigationBar的背景色--by-胡旭
这是我们最终想要得到的效果 思路 在UISrollView的delegate方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView中根据当前 ...