我有一个在完整.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
方法,那么为什么在运行时缺少它?
难道是从全局程序集缓存中提取了错误的程序集?在不破坏需要这些程序集的其他应用程序的情况下,解决该问题的最佳方法是什么?
另一位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([完整程序集签名])。但是,要使用此方法,我们需要知道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接口。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句