【问题标题】:Navision automation C# COM DLLNavision 自动化 C# COM DLL
【发布时间】:2013-06-13 08:39:00
【问题描述】:

我们做了什么:

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


有什么问题?

我们需要将此 DLL 推广到生产环境。我们正在使用 RDP 解决方案,其中 navision 客户端在我们的用户使用的 2 个 RDP 服务器上运行。这意味着我们只需要能够将 DLL 部署到这 2 台服务器上。 我们已经尝试了以下 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 程序员:

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

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

在此之后,我们尝试运行 GACUTIL /i ourDll.dll,它将我们的 DLL 安装到 GAC 中,但结果保持不变。既然我们已经这样做了,就会出现错误消息:

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

但是,这个错误似乎并没有停止编译。运行时的错误信息和上面一样。

【问题讨论】:

  • 我建议您不要将程序集放在 GAC 中(不要拖动到 windows\assembly,不要 GACUTIL),而是使用带有 /codebase 选项的 REGASM。还要确保 COM C# DLL 的位数与 Navision 客户端的位数兼容(32 位与 64 位)

标签: c# dll com navision


【解决方案1】:

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

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

由于目标框架是 3.5,我们假设 REGASM 的版本也必须是

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

【讨论】:

  • 即使此解决方案在生产 navision 客户端上也不起作用,但在开发人员方面却可以正常工作,为什么?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    就我而言,我错过了 /codebase 选项。因此,要注册程序集,我需要使用 /codebase 选项和 /tlb 选项。

    看到这个帖子:What does "Register for COM Interop" actually do?

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2011-04-01
      • 2010-09-11
      • 2015-02-22
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      相关资源
      最近更新 更多