3

我有一个在完整的 .NET 4.6.2 上运行的 ASP.NET Core 1.1 网络服务器。我正在使用ACCPAC.Advantage.dll's(打包在自定义 NuGet 包中)连接到本地 Sage 安装。以前连接已成功启动,我能够将批次过帐到应付帐款。但是现在启动连接失败并出现以下错误:

System.MissingMethodException: Method not found: 'ACCPAC.Advantage.DBLink ACCPAC.Advantage.Session.OpenDBLink(ACCPAC.Advantage.DBLinkType, ACCPAC.Advantage.DBLinkFlags)'.

Intellisense 和 ReSharper 的反编译功能很容易找到Session.OpenDBLink方法,那为什么在运行时会丢失呢?

是否会从全局程序集缓存中提取错误的程序集?在不破坏需要这些程序集的其他应用程序的情况下解决该问题的最佳方法是什么?

4

1 回答 1

2

另一位 Sage 第三方开发人员提出了一个 .Net 问题,听起来就像您正在经历的那样。这就是他们在 Sage City 论坛(Sage City Post)上所说的话:

在 Sage 2018 PU2 中,Sage 决定......

将 \HKLM\SOFTWARE\WOW6432Node\ACCPAC International, Inc.\ACCPAC\Web\A4WNET 的版本号提高到 6.5.0.2,但不要与 .net 运行时库版本 (6.5.0.10) 保持同步。这打破了 Sage300 的 8 个版本,而这两个版本是一致的。

为什么这是个问题?.net 程序集被加载到 GAC 中,为了避免在版本更新后重新编译/重新发布您的应用程序,我们使用反射来加载程序集。

在此更新之前,我们可以使用 System.Reflection.Assembly.Load([full assembly signature])。但是,要使用这种方法,我们需要知道我们通过查询注册表获得的 S300 运行时程序集(Accpac.Advantage.dll)的版本。

为了解决这个问题,我们现在使用 System.Reflection.Assembly.LoadFile 方法。这很好,但它确实绕过了 .net 程序集加载器在调用 Load 时所做的检查。

const string SAGE_RUNTIME = "Sage\\Sage 300 ERP\\ACCPAC.Advantage.dll";

Assembly assem =
Assembly.LoadFile(
System.IO.Path.Combine(
Environment.GetFolderPath(
Environment.SpecialFolder.CommonProgramFilesX86), SAGE_RUNTIME));

编辑:另一种选择是通过 .Net 使用 COMApi 接口。

于 2018-05-04T21:15:17.923 回答