如何使用 Visual Studio 2022 注册 32 位 COM 互操作
How to register for 32-Bit COM interop using Visual Studio 2022
我在使用 Visual Studio 2022 为 COM interop 注册 C# 组件时遇到困难。我以为我理解了这个问题,但即便如此,我还是没能让它工作。
这是基本问题:
- Visual Studio 2022 是 64 位应用程序
- 当您使用 Visual Studio 2022 构建时,它会调用 64 位版本的 MSBuild
- 64 位版本的 MSBuild 调用 64 位版本的 RegAsm,它将组件注册为 64 位 COM 组件
由于现实世界中大多数基于 COM 的应用程序都是 32 位应用程序,这很可能不是您想要的。
虽然这显然是设计使然,但我发现这是一个不幸的设计选择,我已经打开了一个 issue in the Developer Community。如果您同意我的观点,可能有助于对该问题投赞成票。
按照 this page 上的说明,我认为通过以下方式更新我们的项目会很容易:
- 取消选中“注册 COM 互操作”选项
- 用 post-build-event 替换它到 运行 32 位版本的 RegAsm
这是我定义为 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。如果你仔细观察,你会发现不同。
我在使用 Visual Studio 2022 为 COM interop 注册 C# 组件时遇到困难。我以为我理解了这个问题,但即便如此,我还是没能让它工作。
这是基本问题:
- Visual Studio 2022 是 64 位应用程序
- 当您使用 Visual Studio 2022 构建时,它会调用 64 位版本的 MSBuild
- 64 位版本的 MSBuild 调用 64 位版本的 RegAsm,它将组件注册为 64 位 COM 组件
由于现实世界中大多数基于 COM 的应用程序都是 32 位应用程序,这很可能不是您想要的。
虽然这显然是设计使然,但我发现这是一个不幸的设计选择,我已经打开了一个 issue in the Developer Community。如果您同意我的观点,可能有助于对该问题投赞成票。
按照 this page 上的说明,我认为通过以下方式更新我们的项目会很容易:
- 取消选中“注册 COM 互操作”选项
- 用 post-build-event 替换它到 运行 32 位版本的 RegAsm
这是我定义为 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。如果你仔细观察,你会发现不同。