规则

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. Azure Terraform(十)利用 Azure DevOps 的条件语句选择发布环境

    一,引言 之前我讲过的所有的案例中,都是将整个Azure Resource 部署到同一个订阅下,没有做到灵活的在 Azure Pipeline 在运行前选择需要部署的环境.在实际的项目开发中,我们也会 ...

  2. AOP操作-AspectJ配置文件

    AOP操作(AspectJ配置文件)(了解) (实际中大部分用注解方式) 1,创建两个类,增强类和被增强类,创建方法 2,在spring配置文件中创建两个类对象 3,在spring配置文件中配置切入点

  3. 基于Redis&MySQL接口幂等性设计

    基于Redis&MySQL接口幂等性设计 欲把相思说似谁,浅情人不知. 1.幂等 幂等性即多次调用接口或方法不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致. 2.幂等使用场景 前 ...

  4. 阿里智能运维实践|阿里巴巴DevOps实践指南

    编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...

  5. 从服务之间的调用来看 我们为什么需要Dapr

    Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...

  6. CKKS Part3: CKKS的加密和解密

    本篇文章翻译于CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION,主要介绍CKKS方案的加密和解密. 介绍 在上一篇 CKKS Part2: CKKS的 ...

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

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

  8. 关于https域名下的页面iframe嵌套http页面的问题

    业务场景:在一个https域名下用iframe嵌套一个http域名的页面,会直接报错的,报错信息如下: 这段话的意思是:http域名的页面是通过https域名页面加载的,在一个安全的页面不允许加载一个 ...

  9. 「IOI2009」旅行商

    题目传送门 首先,看到这道题感觉就像dp(然鹅没什么用). 一个美好的设想 假如没有两个展销会在同一天开展:前途光明 暴力dp,复杂度o(\(n^2\)). 没有同一天的展销会 暴力dp慢,是因为本质 ...

  10. Java中的UIManager简单实用(皮肤包)

    感谢大佬:https://blog.csdn.net/u010022051/article/details/52671860 注:具体详情请查阅Java API文档 /** * 设置图形界面外观 * ...