从VB.NET到C ++的REGDB_E_CLASSNOTREG

时间:2017-01-24 17:04:51

标签: c++ vb.net com

这是我的问题。

我在Visual Studio 2015( MyLibrary )下用VB.NET编写了一个类。 我将其编译为DLL,并使用'使程序集COM-Visible' 进行检查,因此除了DLL文件外,它还会生成一个.tlb文件。

然后我尝试使用COM机制在Visual Studio 2013下用C ++代码实现此类。 为此,我制作了生成的.tlh文件:

#import "MyLibrary.tlb" raw_interfaces_only

然后我这样做:

// Initialize COM.
HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
cMyLibraryPtr l_pclMyLibrary(__uuidof(MyLibrary));

// Use it
l_pclMyLibrary->DoThings();

当我从安装了两个版本的Visual Studio的计算机上执行此操作时,它在调试或发布模式下运行良好。 但是,当我从另一台我安装的计算机上启动时,#34;我的软件,当我的类的构造函数调用" CreateInstance "

时,我得到 REGDB_E_CLASSNOTREG

我已经检查过或试过这些东西让它发挥作用:

  1. Everythings用x86(VB.NET和C ++)编译,我在两个32位目标上编译
  2. 我尝试通过调用" regasm.exe MyLibrary.dll"来注册我的库。我在注册时检查了注册是否有效。
  3. 我不知道我能做些什么......所以欢迎任何帮助!

    由于 亚历克斯。

1 个答案:

答案 0 :(得分:1)

我运气好了:

regasm /tlb /codebase MyLibrary.dll

注意/ tlb和/ codebase参数......

我还想确保从具有管理员权限的提升命令行运行它。

此外,您需要确保您使用的regasm.exe版本是

1)构建DLL的相同版本的.NET 2)在您的情况下,它是32位版本的regasm.exe而不是64位版本

另一方面,如果您要在同一个安装目录中分发这些内容,则可以使用Isolated COM,这样就不需要注册。