注册 COM Interop DLL > 类未注册

问题描述 投票:0回答:1

我熟悉如何注册COM Interop的过程。例如:

只要我使用管理员权限运行 Visual Studio,此 C# COM DLL 就会编译并注册互操作。

TLB
已创建。所以这个过程存在问题。而且我在运行时从我的应用程序中使用 DLL 没有任何问题(从技术上讲)。

问题来了:

  • 我的主要 Visual C++ 安装程序正确地使用
    regasm
    注册这些 DLL。因此,安装后,我可以毫无问题地运行已安装的应用程序。
  • 但是,如果我尝试从 Visual Studio 运行应用程序(如果我尝试使用/不使用提升,结果是相同的),它会失败:

班级未注册

我理解我认为的问题。安装程序进行注册:

2024-04-11 15:01:09.874   -- Run entry --
2024-04-11 15:01:09.874   Run as: Current user
2024-04-11 15:01:09.874   Type: Exec
2024-04-11 15:01:09.889   Filename: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe
2024-04-11 15:01:09.889   Parameters: MyFile_x64.dll /codebase
2024-04-11 15:01:10.108   Process exit code: 0

但是这个 DLL 的 Visual Studios 版本(保存在我的源代码 Release 文件夹中)未注册。因此,在注册表中找不到该 DLL 的路径。所以我收到这个错误:

班级未注册

由于它是一个 DLL,并且是从 Visual C++ 应用程序使用的,因此我像这样导入 TLB 文件:

#ifdef _WIN64
#import "..\\..\\xxx\\yyy\\bin\\x64\\Release\\MyFile.tlb" raw_interfaces_only named_guids
#else
#import "..\\..\\xxx\\yyy\\bin\\x86\\Release\\MyFile.tlb" raw_interfaces_only named_guids
#endif

不知道是否有帮助。使用DLL正如预期的那样:

void CFoo::Init()
{
    throw_if_fail(m_pInterface.CreateInstance(__uuidof(XXX::XXXClass)));
}

对于我的安装版本和编译版本来说,我缺少什么步骤?


我可以验证:

  1. 两个各自的 DLL 版本配置为注册 COM 互操作设置。因此,创建我们需要的 TLB。

  2. 我的安装程序正在正确注册其各自的 DLL:

Filename: "{dotnet40}\regasm.exe"; \
    Parameters: "MSAToolsLibrary_x86.dll /codebase"; \
    WorkingDir: "{app}\MSAToolsLibrary"; \
    Flags: runhidden; \
    Check: not Is64BitInstallMode

Filename: "{dotnet40}\regasm.exe"; \
    Parameters: "MSAToolsGMailLibrary_x86.dll /codebase"; \
    WorkingDir: "{app}\MSAToolsGMailLibrary"; \
    Flags: runhidden; \
    Check: not Is64BitInstallMode

Filename: "{dotnet4064}\regasm.exe"; \
    Parameters: "MSAToolsLibrary_x64.dll /codebase";  \
    WorkingDir: "{app}\MSAToolsLibrary"; \
    Flags: runhidden; \
    Check: Is64BitInstallMode

Filename: "{dotnet4064}\regasm.exe"; \
    Parameters: "MSAToolsGMailLibrary_x64.dll /codebase"; \
    WorkingDir: "{app}\MSAToolsGMailLibrary"; \
    Flags: runhidden; Check: Is64BitInstallMode

他们正在使用正确的

regasm
注册,我可以在安装后运行任一应用程序。我知道的就这么多了。

我无法运行我的本地主应用程序。


如果我手动将 x64 版本 exe 复制到已安装的 C PF 文件夹并单击它 - 它可以工作。

c# visual-c++ com-interop regasm
1个回答
0
投票

问题似乎是因为我向 DL 项目添加了构建后事件,以将 dll 文件复制到源 C++ 项目的子文件夹中。所以:

  1. 清空 PostBuildEvent 内容。
  2. 删除我的 C++ 项目输出文件夹中的过时文件夹。
  3. 重建一切。

现在一切都很好。 DLL 出现在 3 个位置之一:

  1. x86 安装文件夹。
  2. x64 安装文件夹。
  3. 本地管理构建文件夹。
© www.soinside.com 2019 - 2024. All rights reserved.