Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Исправление Ошибки E0434352 в Delphi с Использованием AssemblyResolve

Delphi , Файловая система , DLL и PlugIns

Если вы столкнулись с проблемой загрузки C# DLL в приложении на Delphi, которое не может найти зависимые библиотеки, вам может помочь механизм разрешения сборок .NET. В данной статье мы рассмотрим, как использовать событие AssemblyResolve для решения этой проблемы.

Описание Проблемы

При вызове метода, экспортируемого из C# DLL в Delphi, возникает внешнее исключение E0434352. Это происходит из-за того, что C# DLL не может найти необходимую зависимую библиотеку itextsharp.dll. Проблема усугубляется тем, что вы не хотите размещать ClassLibrary1.dll и itextsharp.dll в директории с исполняемым файлом приложения, предпочитая использовать их из собственных директорий.

Решение Проблемы с Использованием AssemblyResolve

Событие AssemblyResolve позволяет вам контролировать процесс загрузки сборок .NET. Вы можете настроить это событие, чтобы указать .NET runtime, где искать отсутствующие сборки. Вот пример кода, который устанавливает обработчик события AssemblyResolve в конструкторе класса Class1:

using System;
using System.IO;
using System.Linq;
using System.Reflection;

public class Class1
{
    static Class1()
    {
        var dllDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
        {
            var assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(a => a.FullName == args.Name);
            if (assembly != null)
            {
                return assembly;
            }
            var fileName = args.Name.Split(',')[0] + ".dll";
            var filePath = Path.Combine(dllDirectory, fileName);
            if (File.Exists(filePath))
            {
                return Assembly.LoadFile(filePath);
            }
            return null;
        };
    }

    // Здесь должен быть ваш код экспортируемой функции
    // [DllExport("Test1", CallingConvention = CallingConvention.StdCall)]
    // public static void Test1()
    // {
    //     // ...
    // }
}

Этот код устанавливает обработчик, который будет пытаться загрузить сборку из директории, где находится текущий исполняемый файл DLL. Это позволит .NET runtime найти itextsharp.dll, даже если она не находится в стандартных местах поиска.

Пример Кода Delphi

Теперь давайте обновим код Delphi, чтобы загрузить и вызвать функцию из C# DLL:

procedure TForm1.Button1Click(Sender: TObject);
type
  TDLLProc = procedure; stdcall;
var
  DLLModule: HMODULE;
  DLLProc: TDLLProc;
begin
  DLLModule := LoadLibrary('путь\к\ClassLibrary1.dll');
  if DLLModule = 0 then
    RaiseLastWin32Error;
  DLLProc := GetProcAddress(DLLModule, 'Test1');
  if @DLLProc = nil then
    RaiseLastWin32Error;
  DLLProc(); // Теперь функция должна выполниться без ошибок
end;

Заключение

Использование AssemblyResolve является нормальным и прямым способом загрузки C# DLL, расположенной в другой директории, без необходимости использования отражения. Это решение позволяет сохранить исходный код C# простым и понятным, не внося дополнительных сложностей в процесс загрузки сборок.

Создано по материалам из источника по ссылке.

Проблема в Delphi-приложении связана с невозможностью загрузки C# DLL из-за отсутствия необходимых зависимостей, решением которой является использование механизма разрешения сборок .NET через событие `AssemblyResolve`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:50:47/0.0033869743347168/0