我很难使用VisualStudio2022为COM互操作注册一个C#组件。我以为我理解这个问题,但即使如此,我还是没能让它发挥作用。
这是最基本的问题:
由于现实世界中大多数基于COM的应用程序都是32位应用程序,所以这很可能不是您想要的。
虽然这显然是设计上的,但我发现这是一个不幸的设计选择,我已经打开了一个开发商社区中的问题。如果你同意我的意见,这可能有助于对这个问题投赞成票。
按照关于此页的说明,我认为很容易通过以下方法更新我们的项目:
这是我定义为构建后事件的命令:
"%Windir%Microsoft.NET\Framework\v4.0.30319\regasm.exe” “$(TargetPath)” /codebase
这将导致错误MSB3073,并导致文本“命令.与代码123一起退出”。
完整的输出行是:
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.
我尝试过命令的几个变体,但是我还没有找到一个有效的定义。
有谁知道我在建造后必须输入的命令吗?
发布于 2021-12-10 19:48:02
这个错误很愚蠢,完全是我自己的错。
正确的命令是
"%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>
正如西蒙·穆里尔所指出的,我最初使用的是错误的逗号。原来我使用的是右双引号,Unicode 0x201D而不是普通的引号,Unicode 0x0022。
在我看来,您看不到Visual中的项目属性的差异。
我之所以出现这个错误,是因为我最初复制了命令
“%Windir%Microsoft.NETFramework[64]v4.0.xxxxxregasm” “$(TargetPath)”
来自此Microsoft页面。如果你仔细观察,你会发现两者的区别。
发布于 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运行时.如果Platform
是x86
,那么COM程序集注册也将是32位,而不设置RegisterAssemblyMSBuildArchitecture
属性。我无法证实这一点,因为我还没有尝试过这种方法。
这是由决议所指出的问题在Microsoft Developer Community报告中链接在原来的问题上。
据我所见,RegisterAssemblyMSBuildArchitecture
在其他任何地方都没有文档记录。
https://stackoverflow.com/questions/70281514
复制相似问题