我希望将旧版 VB6 COM+ 组件升级为 VB.NET 组件。我似乎已经升级了一个,叫做 EventPackage,它有一个类,IEventListener。另一个,TradeOrders Implements EventPackage.IEventListener
,。尝试构建 TradeOrders 时,我收到以下错误/警告;
- 无法加载类型库以供参考“EventPackage”。图书馆未注册。(来自 HRESULT 的异常:0x8002801D (TYPE_E_LIBNOTREGISTERED))
- 找不到引用的组件“EventPackage”。
- 未定义类型“EventPackage.IEventListener”。
在 .vbproj 中,我注意到这个参考
<COMReference Include="EventPackage">
<Guid>{0D76C094-21A6-4E04-802B-6E539F7102D7}</Guid>
<Lcid>0</Lcid>
<VersionMajor>2</VersionMajor>
<VersionMinor>0</VersionMinor>
<WrapperTool>tlbimp</WrapperTool>
</COMReference>
当我在注册表中搜索此 Guid 时,我什么也没找到。当为类似的 COM+ 对象使用 GUID 时,我发现它们位于HKEY_CLASSES_ROOT\CLSID\{...}\TypeLib
(“...”是另一个组件的 GUID)。当我去EventPackage.IEventListener对应的注册表键名时,发现没有\TypeLib
子键。您可能会怀疑,在 reg 中搜索“0D76C094-21A6-4E04-802B-6E539F7102D7”不会产生任何结果。
所以我知道这一定是一个注册表问题,但我似乎已经尝试了我找到的每一个谷歌结果。我尝试过 Regasm 和 regsvcs .exe 无济于事。许多页面只是告诉我,将 dll 拖到 COM+ 管理器应该会自动注册组件。
那么如何注册类型库呢?
关于我如何制作 EventPackage COM+ 组件的详细信息
- 运行 VB6->VB.NET 向导
然后我在 assemblyinfo.vb 文件中添加了一些行
- 添加
Imports System.EnterpriseServices
- 添加
Imports System.EnterpriseServices
Imports System.Data.SqlClient
<Assembly: CLSCompliant(True)>
<Assembly: AssemblyKeyFileAttribute("...")>
为了一个强大的名字<Assembly: Guid("...")>
(其中“...”是旧组件的 COM+ CLSID)
我将以下内容添加到类文件 IEventListener.VB
Imports System.EnterpriseServices
<ComClass("...")> _
(其中 ... 是正确的 COM+ CLSID,这是唯一的参数)Inherits ServicedComponent
- 将转换向导生成的 ID 更改为正确的值(
<System.Runtime.InteropServices.ProgId("IEventListener_NET.IEventListener)>
从<System.Runtime.InteropServices.ProgId("EventPackage.IEventListener")> _
然后我将 DLL 拖到适当的 COM+ 应用程序中的 COM+ 管理器中(尽管没有指定“路径”,只是说mscoree.dll
)