如何修复.Net和COM之间枚举名称的问题
由于在.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了。