0

我希望将旧版 VB6 COM+ 组件升级为 VB.NET 组件。我似乎已经升级了一个,叫做 EventPackage,它有一个类,IEventListener。另一个,TradeOrders Implements EventPackage.IEventListener,。尝试构建 TradeOrders 时,我收到以下错误/警告;

  1. 无法加载类型库以供参考“EventPackage”。图书馆未注册。(来自 HRESULT 的异常:0x8002801D (TYPE_E_LIBNOTREGISTERED))
  2. 找不到引用的组件“EventPackage”。
  3. 未定义类型“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+ 组件的详细信息

  1. 运行 VB6->VB.NET 向导

然后我在 assemblyinfo.vb 文件中添加了一些行

  1. 添加Imports System.EnterpriseServices
  2. 添加Imports System.EnterpriseServices
  3. Imports System.Data.SqlClient
  4. <Assembly: CLSCompliant(True)>
  5. <Assembly: AssemblyKeyFileAttribute("...")>为了一个强大的名字
  6. <Assembly: Guid("...")>(其中“...”是旧组件的 COM+ CLSID)

我将以下内容添加到类文件 IEventListener.VB

  1. Imports System.EnterpriseServices
  2. <ComClass("...")> _(其中 ... 是正确的 COM+ CLSID,这是唯一的参数)
  3. Inherits ServicedComponent
  4. 将转换向导生成的 ID 更改为正确的值(<System.Runtime.InteropServices.ProgId("IEventListener_NET.IEventListener)><System.Runtime.InteropServices.ProgId("EventPackage.IEventListener")> _

然后我将 DLL 拖到适当的 COM+ 应用程序中的 COM+ 管理器中(尽管没有指定“路径”,只是说mscoree.dll

4

3 回答 3

0

I think that the problem here is that you haven't generated a type library for your .NET component. I know you said you used regasm - but did you use the right command line?

  • Start Menu => Programs => Microsoft .NET Framework SDK vX.Y => SDK Command Prompt.
  • In this command line line, type: regasm /tlb:Mydll.dll
于 2012-06-07T09:13:52.707 回答
0

控制台命令“regsvr32 mydll.dll”将注册您的 COM 组件。然后,您应该能够在 HKEY_CLASSES_ROOT\CLASSID 下找到 guid,InprocServer32 文件夹将包含您的 dll 的路径。这就是 COM 查找 dll 的方式。

于 2012-06-07T04:19:20.907 回答
0

我昨天遇到了大坝错误(0x8002801D(TYPE_E_LIBNOTREGISTERED)),它让我发疯:VSTO 加载项、COMAddIns 和 RequestComAddInAutomationService

这可能是一个红鲱鱼,但我的答案有类似的细节关于不存在的注册密钥等:

右键单击 Visual Studio (2010) > 以管理员身份运行 > 打开项目 > 编译!

于 2012-06-06T00:22:22.060 回答