2

我希望有人能指出我正确的方向。我分几个步骤列出了问题,希望能澄清问题。

  1. 我使用regsvr32将 C++ DLL 注册到 COM 中。
  2. 然后,我将tlbimp与 C++ DLL 上的/primary属性一起使用,以制作可供 C# 使用的程序集文件。
  3. 然后我将新生成的程序集注册到 GAC 中。
  4. 我在生成的程序集上调用 regasm,以便 C++ 类型库包含对 GACed 程序集的引用。

问题是当我使用regasm /u时,它说它“已成功取消注册”。但是,当我使用 OLEVIEW 检查 COM 中的类型库时,它仍然显示对 GACed 程序集的 PrimaryInterop 引用。

我也尝试过使用 regasm /u /tlb,但我收到警告说:

RegAsm : warning RA0000 : Type library not un-registered since the assembly was
imported from COM

在此处输入图像描述

感谢您的帮助,因为这让我发疯了;)

4

1 回答 1

3

第4步错了,COM服务器已经在第1步注册了。只有在创建自己的COM服务器([ComVisible]属性)时才使用Regasm.exe ,而不是仅使用一个时。在第 2 步中使用 /primary 也是不确定的,当您公开您在自己的公共接口中导入的 COM 类型时,您只需要一个 PIA。最好避免。通过重复步骤 1 修复您可能造成的损坏。

由 tlbimp.exe 生成的互操作程序集只是一个小助手程序集,它只包含从类型库自动生成的声明。帮助 CLR 为 COM 接口方法生成 thunk,而无需解析类型库。如果您有 VS2010 版本,请务必使用嵌入互操作类型功能。

于 2011-07-15T19:56:36.850 回答