首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Visual 2022注册32位COM互操作

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

Stack Overflow用户
提问于 2021-12-08 20:46:30
回答 2查看 2.4K关注 0票数 5

我很难使用VisualStudio2022为COM互操作注册一个C#组件。我以为我理解这个问题,但即使如此,我还是没能让它发挥作用。

这是最基本的问题:

  • Visual Studio 2022是一个64位的应用程序。
  • 使用Visual 2022进行编译时,它将调用64位版本的MSBuild。
  • 64位版本的MSBuild调用64位版本的RegAsm,该版本将该组件注册为64位COM组件。

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

虽然这显然是设计上的,但我发现这是一个不幸的设计选择,我已经打开了一个开发商社区中的问题。如果你同意我的意见,这可能有助于对这个问题投赞成票。

按照关于此页的说明,我认为很容易通过以下方法更新我们的项目:

  • 取消选中“注册COM互操作”选项
  • 将其替换为生成后事件,以运行32位版本的RegAsm。

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

代码语言:javascript
运行
复制
"%Windir%Microsoft.NET\Framework\v4.0.30319\regasm.exe” “$(TargetPath)” /codebase

这将导致错误MSB3073,并导致文本“命令.与代码123一起退出”。

完整的输出行是:

代码语言:javascript
运行
复制
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.

我尝试过命令的几个变体,但是我还没有找到一个有效的定义。

有谁知道我在建造后必须输入的命令吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-10 19:48:02

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

正确的命令是

代码语言:javascript
运行
复制
"%windir%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" "$(TargetPath)" /codebase

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

代码语言:javascript
运行
复制
"%windir%\Microsoft.NET\Framework\v4.0.30319\regasm.exe" "$(TargetPath)" /codebase /tlb

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

代码语言:javascript
运行
复制
<PropertyGroup>
  <PostBuildEvent>"%25windir%25\Microsoft.NET\Framework\v4.0.30319\regasm.exe" "$(TargetPath)" /codebase /tlb</PostBuildEvent>  
</PropertyGroup>

正如西蒙·穆里尔所指出的,我最初使用的是错误的逗号。原来我使用的是右双引号,Unicode 0x201D而不是普通的引号,Unicode 0x0022

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

我之所以出现这个错误,是因为我最初复制了命令

代码语言:javascript
运行
复制
“%Windir%Microsoft.NETFramework[64]v4.0.xxxxxregasm” “$(TargetPath)” 

来自此Microsoft页面。如果你仔细观察,你会发现两者的区别。

票数 4
EN

Stack Overflow用户

发布于 2022-06-17 01:26:17

更优雅的解决方案是使用MSBuild RegisterAssemblyMSBuildArchitecture属性(值为x86 )强制COM程序集注册任务(或regasm)在32位注册表中注册项目的程序集。如果要强制64位COM程序集注册,请为RegisterAssemblyMSBuildArchitecture使用x64值。我将RegisterAssemblyMSBuildArchitecture属性的值x86添加到我的项目文件中,并且它工作了。程序集现在在32位注册表项中注册,而不是在64位注册表项中注册.

显然,如果Platform MSBuild属性是AnyCPU,就会发生这种情况。在这种情况下,COM程序集注册默认为MSBuild运行时的相同位数。对于Visual 2022,这意味着64位MSBuild运行时.如果Platformx86,那么COM程序集注册也将是32位,而不设置RegisterAssemblyMSBuildArchitecture属性。我无法证实这一点,因为我还没有尝试过这种方法。

这是由决议所指出的问题在Microsoft Developer Community报告中链接在原来的问题上。

据我所见,RegisterAssemblyMSBuildArchitecture在其他任何地方都没有文档记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70281514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档