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

How to register for 32-Bit COM interop using Visual Studio 2022

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

这是基本问题:

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

虽然这显然是设计使然,但我发现这是一个不幸的设计选择,我已经打开了一个 issue in the Developer Community。如果您同意我的观点,可能有助于对该问题投赞成票。

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

这是我定义为 post-build-event 的命令:

"%Windir%Microsoft.NET\Framework\v4.0.30319\regasm.exe” “$(TargetPath)” /codebase

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

完整的输出行是:

1>C:\Program Files\Microsoft Visual Studio22\Professional\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(5710,5): error MSB3073: The command ""%Windir%Microsoft.NET\Framework\v4.0.30319\regasm.exe” “C:\CS3\Output\Applications\interop\McDaMBusTimer.dll” /codebase" exited with code 123.

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

有人知道我必须输入的确切命令作为 post-build-step 吗?

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

正确的命令是

"%windir%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" "$(TargetPath)" /codebase

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

"%windir%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" "$(TargetPath)" /codebase /tlb

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

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

正如 Simon Mourier 所指出的,我最初使用的是错误的引号。原来我在用 Right Double Quotation Mark, Unicode 0x201D 而不是 正常 Quotation Mark, Unicode 0x0022.

在我看来,您看不出 Visual Studio 中项目属性的差异。

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

“%Windir%Microsoft.NETFramework[64]v4.0.xxxxxregasm” “$(TargetPath)” 

来自 this Microsoft page。如果你仔细观察,你会发现不同。