繁体   English   中英

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

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

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

这是基本问题:

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

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

尽管这显然是设计使然,但我发现这是一个不幸的设计选择,并且我在开发者社区中打开了一个问题 如果你同意我的观点,它可能有助于对这个问题投赞成票。

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

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

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

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

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

完整的 output 行是:

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” “C:\CS3\Output\Applications\interop\McDaMBusTimer.dll” /codebase" exited with code 123.

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

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

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

正确的命令是

"%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 指出的那样,我最初使用了错误的引号。 事实证明,我使用的是右双引号 Unicode 0x201D而不是正常的引号 Unicode 0x0022

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

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

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

这个微软页面 如果您仔细观察,您会发现差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM