规则

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. JDK并发工具类

    在JDK的并发包里提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程 ...

  2. WebGPU图形编程(2):构建一个单色的三角形<学习引自徐博士教程>

    非常兴奋,我坚持了下来,开始更新我的第二篇博客,还是关于WebGPU的,我在学习过程中,对这项技术非常感兴趣,即使它非常抽象,难以理解,因为我看到未来Web3D的发展,WebGPU会成为主流技术,学习 ...

  3. Nginx限制连接控制访问量

    目录 一:限制连接数模块(同时访问网址能访问多少次) 1.修改网址模块文件 2.测试 3.重启 4.增加解析ip 5.压力测试 二:控制Nginx访问量 1.连接池 2.限制数 3.测试 4.重启 5 ...

  4. __rept__和__str__

    最近一下子学了很多的知识点,导致我有点没反应过来,粗略的在草稿纸记了点自己的想法,趁休息的时间将它敲到博客里面去,免得丢失,这一篇写的挺废话的,有点啰嗦,本篇的重点是第二段程序后开始的总结和后面的几个 ...

  5. Basler相机启动问题xml读取出错

    切记!同一张网卡上多网口分别连多相机的时候,不要用同一个网段!!很容易出错!

  6. TCP和UDP的区别以及应用

    TCP定义 传输控制协议 (Transmission Control Protocol).TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算 ...

  7. 浮动float、浮动影响和清除浮动

    普通流(normal flow) 这个单词很多人翻译为 文档流 , 字面翻译 普通流 或者标准流都可以. 前面我们说过,网页布局的核心,就是用CSS来摆放盒子位置.如何把盒子摆放到合适的位置? CSS ...

  8. vue中的钩子函数

    什么是vue的钩子函数? Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vue实例初始化的不同阶段添加自己的代码,以 ...

  9. Oracle 撤回已经提交的事务

    在PL/SQL操作了一条delete语句习惯性的commit 了,因少加了where条件 导致多删了数据 1.查询视图v$sqlarea,找到操作那条SQL的时间(FIRST_LOAD_TIME) s ...

  10. 通过C#在控制台输出各种图形文字

    这不是要准备公司年会了嘛 每个部门抓壮丁,必须安排至少一个节目 想着上去唱首歌算了,被毙,没有部门特色 妈蛋,唱歌没特色,那隔壁在前线工作的部门要表演个啥,抄表? 冥思苦想之下,给节目加了点部门特色, ...