我熟悉如何注册COM Interop的过程。例如:
只要我使用管理员权限运行 Visual Studio,此 C# COM DLL 就会编译并注册互操作。
TLB
已创建。所以这个过程存在问题。而且我在运行时从我的应用程序中使用 DLL 没有任何问题(从技术上讲)。
问题来了:
regasm
注册这些 DLL。因此,安装后,我可以毫无问题地运行已安装的应用程序。班级未注册
我理解我认为的问题。安装程序进行注册:
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)));
}
对于我的安装版本和编译版本来说,我缺少什么步骤?
我可以验证:
两个各自的 DLL 版本配置为注册 COM 互操作设置。因此,创建我们需要的 TLB。
我的安装程序正在正确注册其各自的 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 文件夹并单击它 - 它可以工作。
问题似乎是因为我向 DL 项目添加了构建后事件,以将 dll 文件复制到源 C++ 项目的子文件夹中。所以:
现在一切都很好。 DLL 出现在 3 个位置之一: