如何将 .NET 程序集注册为 COM?

Posted

技术标签:

【中文标题】如何将 .NET 程序集注册为 COM?【英文标题】:How to register a .NET assembly as COM? 【发布时间】:2012-07-04 13:26:48 【问题描述】:

我已经为本地机器上的工作流创建了一个类库并构建它。我将完整的解决方案移至 Tridion 服务器,并尝试使用 regasm.exe 工具在服务器中注册程序集,如下所示:

C:\User\XYZ\Desktop\>RegAsm \codebase F:\Workflow\WorkflowHandler/bin/debug/WorkflowHandler.dll

我收到以下错误:

未能加载 'F:\Workflow\WorkflowHandler/bin/debug/WorkflowHandler.dll ' 因为它不是有效的 .NET 程序集。

我的服务器详情:

已安装 64 位、Windows Server 2008 R2 Enterprise 和 .NET Framework 4。

【问题讨论】:

会不会是 32 位与 64 位的问题?会不会是远程系统没有安装 .NET 4.0? 它是一个 64 位服务器,安装了 .net 4,我在框架 4 中构建了类库 你知道你在“\codebase”上的斜线走错了,对吧?它应该是“/codebase”(不带引号)。 是的,我也这样累 (F:\Workflow> RegAsm /codebase F:/workflow/workflowhandler/bin/debug/workflowhandler.dll) ,仍然得到同样的错误。并试图将“/”更改为“\”,仍然是同样的错误。并试图给“”之间的dll路径,仍然是同样的错误。在我的类库解决方案中,我使用解决方案属性创建了强名称,并且在 assemblyinfo.cs 文件中我将 com visible = "true" 设置为除此之外的任何内容。 【参考方案1】:

您确定您的路径中有正确的RegAsm,因为您仅通过 exe 名称调用它而不指定完整路径?您必须调用正确版本的 RegAsm 才能使其工作,即 .NET 4 的 32 位或 64 位版本。

尝试指定完整路径:

c:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase F:\Workflow\WorkflowHandler\bin\debug\WorkflowHandler.dll

c:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe /codebase F:\Workflow\WorkflowHandler\bin\debug\WorkflowHandler.dll

我还注意到,在您的程序集的路径中,您有一些 / 字符而不是 \。确保您输入的路径正确。

【讨论】:

非常感谢,我使用了错误的RegAsm.exe,现在我可以成功注册了。我如何检查注册的程序集是否在正确的位置?是不是真的注册了? @user1428019 如果没有失败,应该是注册成功了。如果您在机器上注册了 Visual Studio,您可以尝试添加对 COM 组件的引用并查看它是否列在此处。否则,您可以编写一个 VBScript 并尝试在那里实例化 COM 组件。 谢谢。我在 64 位机器上使用 Framework64 RegAsm,当我使用 32 位机器时,它可以工作。必须是 32 位 dll :) 太棒了!我启动了错误的 Visual Studio 命令提示符,如果我明确引用了 .NET 2.0 regasm,它会第一次起作用。谢谢。【参考方案2】:

我将用我的解决方案扩展已接受的答案。

首先,我遇到了“AnyCPU”的问题(我必须与 COM 互操作,因此我这样做的原因),所以我将平台限制为 x86 和 x64。我希望它将组件注册为构建的一部分,因此我将其作为构建后事件进行:

if $(PlatformName) == x64 (
    set RegAsm=$(MSBuildFrameworkToolsPath64)regasm.exe
) else (
    set RegAsm=$(MSBuildFrameworkToolsPath)regasm.exe
)

echo Creating TypeLib
"%RegAsm%" /tlb "$(TargetPath)"
echo Registering Component
"%RegAsm%" "$(TargetPath)"

注意:这可能不适用于 ia64。但是,如果您必须为其中之一进行这项工作,那么您将遇到比这更大的问题。 :-)

【讨论】:

以上是关于如何将 .NET 程序集注册为 COM?的主要内容,如果未能解决你的问题,请参考以下文章

从 Powerbuilder 应用程序调用 .Net COM 程序集(无需注册)

是否可以从 .NET 测试 COM 公开的程序集?

COM 互操作加载程序集时 AppDomain 的路径

asp.net Web.config中assembly注册程序集的目的

团队博客13

msadox28.tlb 在注册时不是有效的 .Net 程序集文件