2

我们做了什么:

我们创建了一个 C# 类库项目来与外部 Web 服务通信。当我们选中“注册 COM 互操作”时,此 DLL 会自动注册并准备好在发生注册的 PC 上使用。然后,该 PC 上的 Navision 客户端可以使用“自动化”变量来查找并使用该 DLL。


有什么问题?

我们需要将此 DLL 推广到生产环境。我们正在使用 RDP 解决方案,其中 navision 客户端在我们的用户使用的 2 个 RDP 服务器上运行。这意味着我们只需要能够将 DLL 部署到这 2 台服务器上。我们已经尝试了以下两种解决方案,我们在这里和几篇博客文章中找到了:

  • 将 DLL 拖到 C:\windows\assembly(以管理员身份)
  • 使用 REGASM 注册 DLL (REGASM ourDll.dll /tlb:ourDll.dll)

执行完这些后,我们在 Navision 中找到了我们尝试使用 CREATE 命令初始化的 DLL:

CLEAR(ourDll);
CREATE(ourDll);
IF ISCLEAR(ourDll) THEN
    CREATE(ourDll);

但在此之后我们收到以下错误(翻译版):

此消息适用于 C/AL 程序员:

无法创建由自动化服务器标识的 OLE 控件或自动化服务器的实例,标识 GUID={guid} 1.0:{guid}:'ourDll'.Consume

验证 OLE 控件或自动化服务器是否已正确安装和注册。

在此之后,我们尝试运行 GACUTIL /i ourDll.dll 将我们的 DLL 安装到 GAC 中,但结果保持不变。因为我们已经这样做了,所以有一个错误消息:

文本对于缓冲区来说太长。

然而,这个错误似乎并没有停止编译。运行时的错误消息与上面相同。

4

3 回答 3

1

我们能够解决这个问题并在此处分享最终解决方案,这样遇到相同情况的人可能不需要花费我们投入的大量时间:

问题不在于 guid 或接口,而是 .NET Framework 的 REGASM 的使用版本。

由于目标框架是 3.5,我们假设 REGASM 的版本也必须是 <= 3.5,我们还假设我们必须使用 64 位框架的 REGASM。然而,经过大量的试验和错误之后,我们必须使用的版本似乎是 32 位 v4 REGASM(请参阅下面我们使用的注册 .bat 文件),这解决了所有问题,我们的 DLL 现在很高兴在 Navision 中使用客户。

SET GACUTIL="C:\Program Files (X86)\Microsoft SDKs\Windows\v7.0A\bin\gacutil.exe"
SET REGASM="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm.exe"
%REGASM% OurDll.dll /tlb:OurDll.tlb
%GACUTIL% /i OurDll.dll
于 2013-06-20T08:16:47.267 回答
0

In my case I missed the /codebase option. So to register the assembly I needed to use the /codebase option and the /tlb option.

See this post: What does "Register for COM Interop" actually do?

于 2014-09-19T08:49:23.407 回答
0

假设您使用的是 NAV 2009 R2 或 2013:当您在全局范围内注册它时,IDE 可以访问它。要真正让 NAV 服务层使用程序集,您还需要将它的副本放入C:\Program Files\Microsoft Dynamics NAV\70\Service\Add-ins

于 2013-06-13T15:59:55.357 回答