规则

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. VS code远程连接Linux 开发C++ 配置详细介绍

    VS code 远程连接服务器,编译C++ 一.前期准备 1.VS code安装 Remote-SSH插件 2.Windows安装SSH. 3.Linux服务器连接测试. a.接通测试使用ping命令 ...

  2. golang操作mysql

    1. 安装mysql驱动库和sqlx基于官方sql库的扩展库 go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx ...

  3. 搭建BBS博客系统

    目录 一:搭建BBS项目 1.部署数据库 2.启动数据库 3.进入数据库 4.远程连接MySQL数据 5.pycham连接Mysql 二:开始部署BBS 1.上传代码 2.数据库迁移 3.删除文件 4 ...

  4. 关于一键提取QQ群成员信息的记录

    问题情境 昨天晚上回宿舍看到舍友在吐槽:天哪,我要把70多个人的QQ号全统计出来,只能一个一个地在咱们学院的学院群里找.吐了. 当时我第一反应是用python写个脚本之类的去做,因此查阅了一下资料,找 ...

  5. CKKS Part4: CKKS的乘法和重线性化

    本文翻译于CKKS EXPLAINED, PART 4: MULTIPLICATION AND RELINEARIZATION,主要介绍CKKS方案中的密文乘法和重线性化技术 介绍 在上一篇 CKKS ...

  6. Maven的安装、配置与使用

    5.Maven 我为什么要学习这个技术? 在JavaWeb开发中,需要使用大量的jar包,我们手动去导入: 如何能够让一个东西自动帮我们导入和配置这个jar包. 由此,Maven诞生! 5.1.Mav ...

  7. Atcoder ARC-125

    写的详细的就是我不会做的... A 显然至多有一次移动距离 \(> 1\) 只需判断这个位置在哪里即可. 复杂度 \(\mathcal{O}(n)\). B 令 \(x ^ 2 - y = z ...

  8. 理解java线程的中断(interrupt)

    一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...

  9. 什么是Autolayout

    Autolayout是一种"自动布局"技术,专门用来布局UI界面的 Autolayout自iOS 6开始引入,由于Xcode 4的不给力,当时并没有得到很大推广 自iOS 7(Xc ...

  10. CSS:第1课

    CSS选择器有:id选择器.派生选择器 1.id选择器 id 选择器可以为标有特定 id 的 HTML 元素指定特定的样式. id 选择器以 "#" 来定义. #red {colo ...