Исключение недостающего метода ACCPAC - PullRequest
0 голосов
/ 04 мая 2018

У меня есть веб-сервер 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 Ответ

0 голосов
/ 05 мая 2018

Другой сторонний разработчик 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.

...