如何使用 Visual Studio 2022 注册 32 位 COM 互操作

Phi*_*ans 7 c# msbuild com-interop visual-studio visual-studio-2022

我在使用 Visual Studio 2022 注册用于 COM 互操作的 C# 组件时遇到困难。我以为我理解了这个问题,但即便如此,我也没能让它工作。

\n

这是基本问题:

\n
    \n
  • Visual Studio 2022 是一个 64 位应用程序
  • \n
  • 当您使用 Visual Studio 2022 进行构建时,它会调用 64 位版本的 MSBuild
  • \n
  • 64 位版本的 MSBuild 调用 64 位版本的 RegAsm,后者将组件注册为 64 位 COM 组件
  • \n
\n

由于现实世界中大多数基于 COM 的应用程序都是 32 位应用程序,因此这很可能不是您想要的。

\n

虽然这显然是设计使然,但我发现这是一个不幸的设计选择,我已经在开发者社区中提出了一个问题。如果您同意我的观点,这可能有助于对该问题进行投票。

\n
\n

尝试的解决方法:

\n

按照本页上的说明,我认为通过以下方式更新我们的项目会很容易:

\n
    \n
  • 取消选中“注册 COM 互操作”选项
  • \n
  • 将其替换为构建后事件以运行 32 位版本的 RegAsm
  • \n
\n

这是我定义为构建后事件的命令:

\n
"%Windir%Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe\xe2\x80\x9d \xe2\x80\x9c$(TargetPath)\xe2\x80\x9d /codebase\n
Run Code Online (Sandbox Code Playgroud)\n

这会导致错误 MSB3073 和文本“命令...退出,代码为 123”。

\n

完整的输出行是:

\n
1>C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\amd64\\Microsoft.Common.CurrentVersion.targets(5710,5): error MSB3073: The command ""%Windir%Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe\xe2\x80\x9d \xe2\x80\x9cC:\\CS3\\Output\\Applications\\interop\\McDaMBusTimer.dll\xe2\x80\x9d /codebase" exited with code 123.\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试了该命令的几种变体,但还没有找到有效的定义。

\n
\n

有人知道我作为构建后步骤必须输入的确切命令吗?

\n

Phi*_*ans 5

这个错误非常愚蠢,完全是我自己的错。

\n

正确的命令是

\n
"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe" "$(TargetPath)" /codebase\n
Run Code Online (Sandbox Code Playgroud)\n

如果需要生成类型库文件,应该使用命令

\n
"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe" "$(TargetPath)" /codebase /tlb\n
Run Code Online (Sandbox Code Playgroud)\n

如果想直接编辑到项目文件中,可以使用

\n
<PropertyGroup>\n  <PostBuildEvent>"%25windir%25\\Microsoft.NET\\Framework\\v4.0.30319\\regasm.exe" "$(TargetPath)" /codebase /tlb</PostBuildEvent>  \n</PropertyGroup>\n
Run Code Online (Sandbox Code Playgroud)\n

正如西蒙·穆里尔(Simon Mourier)指出的那样,我最初使用了错误的引号。事实证明,我使用的是\n右双引号,Unicode 0x201D而不是\n正常的引号,Unicode 0x0022。

\n

在我看来,您无法在 Visual Studio 中看到项目属性的差异。

\n

我出现此错误的原因是我最初复制了命令

\n
\xe2\x80\x9c%Windir%Microsoft.NETFramework[64]v4.0.xxxxxregasm\xe2\x80\x9d \xe2\x80\x9c$(TargetPath)\xe2\x80\x9d \n
Run Code Online (Sandbox Code Playgroud)\n

来自此 Microsoft 页面。如果你仔细观察,你会发现其中的差异。

\n