Исключение отсутствующего метода ACCPAC
У меня есть веб-сервер ASP.NET Core 1.1, работающий на полной версии.NET 4.6.2. Я использую 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
метод, так почему он отсутствует во время выполнения?
Может ли это быть неправильной сборкой из глобального кэша сборок? Каков наилучший способ решить эту проблему, не нарушая другие приложения, требующие этих сборок?
1 ответ
Другой сторонний разработчик 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). Это сломало 8 версий Sage300, где две были в шаге.
Почему это проблема? Сборки.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));
Изменить: Другой вариант будет использовать интерфейс COMApi через.Net.