如何修复.Net和COM之间枚举名称的问题
2010-12-24 17:45
591 查看
由于在.Net中的枚举在通过regasm(如:Regasm PCTSEventLog.dll /t )生成tlb文件并注册的时候,会自动在枚举名称前面加上枚举的类型名称然后加上下划线,例如:
enum {
Connect = 1,
Amelior = 2,
DailyLogs = 3,
Maint = 4,
HL7PatientMatching = 5,
Secretary = 6,
Misc = 7,
SubmittedOrders = 8
} dwEventLogCategories;
在自动生成tlb时,会变成:
enum {
dwEventLogCategories_Connect = 1,
dwEventLogCategories_Amelior = 2,
dwEventLogCategories_DailyLogs = 3,
dwEventLogCategories_Maint = 4,
dwEventLogCategories_HL7PatientMatching = 5,
dwEventLogCategories_Secretary = 6,
dwEventLogCategories_Misc = 7,
dwEventLogCategories_SubmittedOrders = 8
} dwEventLogCategories; 如果我们是对已有的系统进行升级的时候就不得不修改我们原有的旧代码了。如果是多个小组一起开发的话,这也会存在一些问题。但是我们可以通过修改tlb的方法,来达到不修改原有代码。 方法的原理就是:从.net的dll中导出tlb文件,然后根据tlb文件导出idl文件,我们然后通过midl将idl文件编译成tlb文件,再在目标系统注册tlb就完成了。 下面我们就一步一步来完成这个过程: 1 利用以下命令导出tlb文件(tlbexp和regasm的区别就是,regasm会导出之后并注册tlb文件): @ehco Off set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin" %binDir%\tlbexp PCTSEventLog.dll Pause 2 打开ole view,选择File->TypeLib view…,然后打开刚才生成的tlb文件,打开之后Save As为idl文件 3 打开idl文件,去掉tlbexp自动增加的枚举类型名(如:dwEventLogCategories_),改成下面这个样子并保存,注意红色的地方,如果不加红色的地方,那么idl会生成一个诡异的枚举名称: enum dwEventLogCategories{
Connect = 1,
Amelior = 2,
DailyLogs = 3,
Maint = 4,
HL7PatientMatching = 5,
Secretary = 6,
Misc = 7,
SubmittedOrders = 8
} dwEventLogCategories;
4 先运行vcvarsall.bat(%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86)来设置.net的环境变量,然后再运行下面的命令:
@echo off set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin" %binDir%\MIDL PCTSEventLog.idl Pause
5 注册刚刚生产的tlb文件
regtlib PCTSEventLog.tlb
好了,你大功告成了,在VB6或者其他环境中调用看看,是不是ok了。
enum {
Connect = 1,
Amelior = 2,
DailyLogs = 3,
Maint = 4,
HL7PatientMatching = 5,
Secretary = 6,
Misc = 7,
SubmittedOrders = 8
} dwEventLogCategories;
在自动生成tlb时,会变成:
enum {
dwEventLogCategories_Connect = 1,
dwEventLogCategories_Amelior = 2,
dwEventLogCategories_DailyLogs = 3,
dwEventLogCategories_Maint = 4,
dwEventLogCategories_HL7PatientMatching = 5,
dwEventLogCategories_Secretary = 6,
dwEventLogCategories_Misc = 7,
dwEventLogCategories_SubmittedOrders = 8
} dwEventLogCategories; 如果我们是对已有的系统进行升级的时候就不得不修改我们原有的旧代码了。如果是多个小组一起开发的话,这也会存在一些问题。但是我们可以通过修改tlb的方法,来达到不修改原有代码。 方法的原理就是:从.net的dll中导出tlb文件,然后根据tlb文件导出idl文件,我们然后通过midl将idl文件编译成tlb文件,再在目标系统注册tlb就完成了。 下面我们就一步一步来完成这个过程: 1 利用以下命令导出tlb文件(tlbexp和regasm的区别就是,regasm会导出之后并注册tlb文件): @ehco Off set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin" %binDir%\tlbexp PCTSEventLog.dll Pause 2 打开ole view,选择File->TypeLib view…,然后打开刚才生成的tlb文件,打开之后Save As为idl文件 3 打开idl文件,去掉tlbexp自动增加的枚举类型名(如:dwEventLogCategories_),改成下面这个样子并保存,注意红色的地方,如果不加红色的地方,那么idl会生成一个诡异的枚举名称: enum dwEventLogCategories{
Connect = 1,
Amelior = 2,
DailyLogs = 3,
Maint = 4,
HL7PatientMatching = 5,
Secretary = 6,
Misc = 7,
SubmittedOrders = 8
} dwEventLogCategories;
4 先运行vcvarsall.bat(%comspec% /k ""C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"" x86)来设置.net的环境变量,然后再运行下面的命令:
@echo off set binDir="C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin" %binDir%\MIDL PCTSEventLog.idl Pause
5 注册刚刚生产的tlb文件
regtlib PCTSEventLog.tlb
好了,你大功告成了,在VB6或者其他环境中调用看看,是不是ok了。
相关文章推荐
- 如何修复.Net和COM之间枚举名称的问题(续)
- 如何最大限度提高.NET的性能(南京捷帝科技 www.jiedichina.com)
- 如何将.Net开发的DLL注册为COM(转)
- .Net调用Office Com组件的原理及问题检索com类工厂组件检索 COM 类工厂中 CLSID 为 {XXX} 的组件失败
- .net关于如何给用户控件传值问题解决
- 一起谈.NET技术,如何解决分布式系统中的跨时区问题[原理篇]
- Echarts3之修复全国地图省名称显示不居中的问题
- volcanol_Linux_问题汇总系列_2_如何在linux和windows主机之间共享文件
- 如何遍列 C# 枚举数的名称与值
- 事物复制中大项目(Large Article)出问题如何快速修复
- 如何修改Xcode项目名称(附解决点击运行后提示:finished running 不能运行问题)
- 解决.net中使用gmail.com邮箱进行Smtp发送信件时失败的问题
- 如何修复SQLSERVER数据库"置疑"问题
- 汉字编码与编程相关问题总结:ASCII、机内码、区位码、国标码、Unicode码他们之间是如何转换的
- 如何用.net实现两台机子之间的数据间的传送?
- 如何应用.NET中的消息队列服务开发者在线 Builder.com.cn 更新时间:2008-08-05作者: 来源:开发者在线
- AS3与.net之间的Socket编码转换的endian问题
- 如何将枚举类型作为数据源绑定在一个DROPDOWNLIST上,并指定用户可见枚举的真实值是名称
- 【吐槽篇之经验<四>】如何运用Stand-Alone Profiler定位.NET代码级问题
- 重命名计算机名称导致TFS版本管理下的工作区问题的修复