我有一个在完整的.NET 4.6.2上运行的ASP.NET Core 1.1 Web服务器。我使用ACCPAC.Advantage.dll
(打包在自定义NuGet包中)连接到本地Sage安装。以前连接已成功启动,我可以将批次过帐到应付帐款。但现在启动连接失败,出现以下错误:
System.MissingMethodException: Method not found: 'ACCPAC.Advantage.DBLink ACCPAC.Advantage.Session.OpenDBLink(ACCPAC.Advantage.DBLinkType, ACCPAC.Advantage.DBLinkFlags)'.
Intellisense和ReSharper的反编译功能可以轻松找到Session.OpenDBLink
方法,那么为什么在运行时会丢失它?
它可能是从全局程序集缓存中提取错误的程序集吗?在不破坏需要这些程序集的其他应用程序的情况下解决这个问题的最佳方法是什么?
答案 0 :(得分:1)
另一位Sage第三方开发者提出了一个听起来像您正在经历的.Net问题。这是他们在Sage City论坛上所说的话(Sage City Post):
在Sage 2018中,PU2 Sage决定......
将\ HKLM \ SOFTWARE \ WOW6432Node \ ACCPAC的版本号Bump 国际公司\ ACCPAC \ Web \ A4WNET到6.5.0.2但不保留此信息 使用.net运行时库版本(6.5.0.10)。这已经破裂了 Sage300的8个版本,其中两个已经步入。
为什么这是一个问题? .net程序集加载到GAC和 避免在版本之后重新编译/重新发布您的应用程序 更新我们使用反射来加载程序集。
在此更新之前,我们可以使用 System.Reflection.Assembly.Load([完整程序集签名])。然而, 要使用此方法,我们需要知道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接口。