Выполнение сборки программы с новой версией DLL без изменений в исполняемом коде без локальной копии или публикация DLL C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Выполнение сборки программы с новой версией DLL без изменений в исполняемом коде без локальной копии или публикация DLL

Сообщение Anonymous »

извините за странный заголовок, не знаю, как лучше всего описать проблему.
//EDIT:
Теперь мы создали небольшую консольную программу, чтобы изолировать проблему.Нам приходится использовать некоторые сторонние библиотеки DLL из системы ERP, поскольку нашей программе требуется соединение с системой ERP для создания клиентов, счетов-фактур и всего такого.
Мы используем библиотеки DLL, существующие на компьютере конечного пользователя. .
Ни одна из этих сборок не публикуется вместе с нашей программой.
В библиотеках DLL используется .NET Framework. Мы не можем изменить библиотеки DLL самостоятельно.
У нас возникла эта проблема, поскольку один из наших коллег обновил систему ERP до последней версии.
Они внесли некоторые изменения в библиотеки DLL. .
На данный момент у нас есть около 3 разных версий на 3 разных машинах.
Вот 3 скриншота проблемной части DLL в проводнике объектов.
Моя версия с Mandant — WPFHostMandant
Новейшая версия с Mandant — Mandantbase
Самая старая версия, просто Mandant
Странно то, что я могу использовать сборку программы с машины с самой старой версией, а мою сборку с WPFHostMandant также можно использовать на машине с самой старой версией.
Все 3 сборки можно использовать на самой новой версии. .
Если мы попытаемся использовать сборку программы с самой новой версией, мы получим исключение.
Я имею в виду, что вы ожидаете, что моя версия с WPFHostMandant также вызовет исключение на компьютере с самой старой версией , у которого нет ни WPFHostmandant, ни Mandantbase.

Код: Выделить всё

System.TypeLoadException: The type "Sagede.OfficeLine.Engine.MandantBase" in the assembly "Sagede.OfficeLine.Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=4ad8971889b881a9" could not be loaded.

Код: Выделить всё

static void Main(string[] args)
{
try
{
// Set up assembly resolver
// We use this for years to load the assembly dynamically from the customer system
// The LoadAssembly Methode is probably not relevant for this problem
// we just determine the ERP system version, read some config files to get the
// correct path and the we use return Assembly.LoadFrom() to load the DLL.
AppDomain.CurrentDomain.AssemblyResolve += LoadAssembly;

// Check if the values are preset, if not, get user input from console
if (_database == null)
{
Console.WriteLine("Please enter database: ");
_database = Console.ReadLine();
}
if (_mandantId == null)
{
Console.WriteLine("Please enter mandant: ");
_mandantId = Console.ReadLine();
}
if (_username == null)
{
Console.WriteLine("Please enter username: ");
_username = Console.ReadLine();
}
if (_password == null)
{
Console.WriteLine("Please enter password: ");
_password = Console.ReadLine();
}

// Close the connection, in case there is an open connection
CloseConnection(); // **If this call is removed, the exception occurs in Connect() below instead

// Execute connection code
Connect();

// Print success message
Console.WriteLine("Connection successful.  Closing connection now...");

CloseConnection();

// Print success message
Console.WriteLine("Connection closed.");
}
catch (Exception ex)
{
// Print error message
Console.WriteLine("Exception:");
Console.WriteLine(ex);
}

// Wait for a key press before exiting the program
Console.WriteLine("Press any key to exit..");
Console.ReadKey();
}

static void Connect()
{
// Create Sage session and mandant
var namePasswordCredential = new Sagede.Core.Tools.NamePasswordCredential(_username, _password);
_session = ApplicationEngine.CreateSession(_database, Sagede.OfficeLine.Shared.ApplicationToken.System, null, namePasswordCredential);
_mandant = _session.CreateMandant(Convert.ToInt16(_mandantId)); // **Creating the mandant does not cause the exception
var sessionMandantLicense = _mandant.License; // **This access to the mandant causes the exception
}

public static void CloseConnection()
{
// **One of these causes the exception, probably the access to the mandant
_session?.RemoveMandant(_mandant);
_session?.Close();
_mandant?.Dispose();
_session?.Dispose();
_mandant = null;
_session = null;
}
Все остальное должно быть объяснено в комментариях к коду.
Надеюсь, это немного облегчит понимание проблемы и поможет найти решение.
Спасибо!


//старое (вероятно, запутанное) объяснение проблемы:
Хорошо, мы у нас есть программа, которая подключается к системе ERP, и для создания клиента и сеанса мы используем их библиотеки DLL.
Таким образом, все, что нам нужно, уже существует в системе конечных пользователей, мы не делаем локальную копию и не публикуем какую-либо из этих систем ERP. DLL.
Мой коллега обновил ERP-систему на своем компьютере до последней версии.
В его системе все в порядке, никаких изменений кода не требуется.
Но если он создаст сборку проекта на своем компьютере, а мы попытаемся использовать его в системе клиента без новейшей версии ERP-системы, мы получим исключение, связанное с DLL.
Это тот же код, тот же проект , никаких изменений, но если мы заменим только Exe из моей системы (еще более старая версия системы ERP) на версию из его системы, это сработает.
Итак, методы, которые мы используем непосредственно из DLL должна быть той же самой, поскольку у нас не было никаких изменений в нашем коде, но похоже, что что-то изменилось в коде DLL, стоящем за методами, которые мы вызываем, и хотя мы используем версию DLL из системы конечного пользователя, кажется, что код не просто вызывает метод больше похож на то, что он напоминает обо всем, что стоит за ним, и ожидает того же.
Мой Exe работает со старыми и новыми версиями.
Итак, на данный момент, если вы хотите создать новую версию и создает установщик, мне нужно создать файл Exe и передать его ему.
Вот исключение, которое мы получаем с его файлом Exe.

Код: Выделить всё

System.TypeLoadException: The type "Sagede.OfficeLine.Engine.MandantBase" in the assembly "Sagede.OfficeLine.Engine, Version=9.0.0.0, Culture=neutral, PublicKeyToken=4ad8971889b881a9" could not be loaded.
at maniacConnect.Models.Helper.SageConnectionHelper.CloseConnection()
at maniacConnect.ViewModels.MainMenu.MainMenuViewModel.LoadSettingsData()
Спасибо!
Мы проверили каждую ссылку, которую смогли найти в нашем проекте, чтобы убедиться, что ничего не упущено из виду.
Спросил Google и ИИ нашел решение, но не смог найти ничего о подобном поведении.
Мы ожидаем, что не получим никаких исключений, связанных с DLL, поскольку мы используем DLL с компьютера конечного пользователя.

Подробнее здесь: https://stackoverflow.com/questions/788 ... e-executin
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»