powershell初探(九)
最近公司需要用到com,其中涉及到很多的注册问题,记录在这里,希望在帮到别人的同时,也能解决自己的问题。
0:写在前面,本人菜鸟一枚。本章的总结都来自于网络,如果有错漏之处,还望牛人指正~
1:COM是做什么用的?
com是包含了实现一个或多个接口的类的一个实例的二进制文件(dll或exe)。好吧,我也晕了~首先,com是一个类的实例的二进制文件,这个类必须实现一个或多个接口。它的存在是为了代码的重用,让你可以像组装汽车一样组装你的程序。他需要注册到注册表中,并需要一个唯一的标示,以便在之后创建时通过这个唯一的标示来找到对应的com并且创建它。
2:regsvr32和regasm有什么不同?
regsvr32是注册传统的COM组件的方法,regasm是将用.NET编写的dll注册为COM组件的方法。具体区别会在后面说明。
3:一个32位的传统COM如何在64位的机器上注册或者使用?
首先,传统的32位机器注册传统的COM组件应该是在\WINDOWS\System32 下,进入这个目录运行regsvr32 xxx.dll。但是当你在64位机器上运行时会得到这个错误
此时你需要将这个dll放在/WINDOWS/SysWOW64下进入这个目录运行一次regsvr32 xxx.dll在你的dll没问题的情况下会提示你注册成功
看到这个之后,别高兴太早,当你真正的去ASP页面中创建这个对象并且访问这个ASP页面,你会得到如下错误
这是因为你的IIS不是在兼容32位应用的模式下运行的,打开CMD输入
cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs set W3SVC/AppPools/Enable32bitAppOnWin64 1
此时你的IIS将兼容32位的com组件。你可以成功的使用COM了
PS:要是在sys64WOW下也提示你找不到模块,那你该去查查你的系统了,推荐一个depends的工具,可以查看你的dll缺失的模块
4:如何将C#代码编写的dll注册并作为COM使用?
a:在VS中创建一个C#库类项目,输入以下代码(只是一个事例,可根据具体情况调整)
using System; using System.Runtime.InteropServices;//必须引用该程序集,这样才能在方法,类名前加上Guid特性 using System.Text; namespace MyCom { [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]//guid,唯一标示接口 public interface MyCom_Interface { [DispId(1)]//接口方法的ID int Add(int a, int b); } [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]//在Com中调用事件必须以接口的方式 public interface MyCom_Events { } [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(MyCom_Events))]//标示唯一类名 public class Class1 : MyCom_Interface { public int Add(int a, int b) { return a + b; } } }
b:配置VS
(0):右键项目名,打开属性窗口
(1):在应用程序下单击程序集信息,勾选使程序集COM可见
(2):在生成下勾选为COM互操作注册
(3):在签名下新建一个签名,以便生成一个强命名的程序集
(4):生成该解决方案
c:打开VS的命令行工具,将目录切换到刚刚生成的程序集的目录下
d:输入以下命令,注册程序集
regasm /codebase /tlb xxx.dll
成功信息
将程序集添加到全局缓存域
gacutil /i xxx.dll
在注册表下我们可以看到这个COM对象了
这里显示的是progID,也就是将要在powershell中使用的com的名字
PS:原教程请看这个链接http://blog.sina.com.cn/s/blog_538342930100nlmk.html
GUID可以使用VS自带的工具生成
5:现在,这个COM就可以在powershell中使用了(当然也可以在ASP页面中使用)
最后,新的一年,祝大家愉快~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述