Вызов.NET DLL в Inno Setup

Я пытаюсь загрузить DLL, написанную на C#, в Inno Setup.

Вот код:

function Check(version, dir: String): Integer;
external 'Check@{src}\check.dll stdcall';

Тогда я называю это как Check(x,y)

Но DLL не может быть загружена.

Я попробовал это с stdcall а также cdecl,

check.dll файл вместе с setup.exe,

Почему это не работает?

3 ответа

Используйте неуправляемый экспорт для экспорта функции из сборки C#, чтобы ее можно было вызывать в Inno Setup.

  • Реализуйте статический метод в C#
  • Добавьте пакет неуправляемого экспорта NuGet в свой проект
  • Установите целевую платформу вашего проекта на x86
  • Добавить DllExport приписать ваш метод
  • Если необходимо, определите маршалинг для аргументов функции (в частности, маршалинг строковых аргументов должен быть определен).
  • строить
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;

namespace MyNetDll
{
    public class MyFunctions
    {
        [DllExport(CallingConvention = CallingConvention.StdCall)]
        public static bool RegexMatch(
            [MarshalAs(UnmanagedType.LPWStr)]string pattern,
            [MarshalAs(UnmanagedType.LPWStr)]string input)
        {
            return Regex.Match(input, pattern).Success;
        }
    }
}

На стороне Inno Setup (версия Unicode):

[Files]
Source: "MyNetDll.dll"; Flags: dontcopy

[Code]
function RegexMatch(Pattern: string; Input: string): Boolean;
    external 'RegexMatch@files:MyNetDll.dll stdcall';

И теперь вы можете использовать свою функцию:

if RegexMatch('[0-9]+', '123456789') then
begin
  Log('Matched');
end
  else
begin
  Log('Not matched');
end;

Смотрите также:

Взгляните на неуправляемый экспорт от Роберта Гизеке.

Я не думаю, что это возможно. Управляемые библиотеки DLL не экспортируют функции напрямую. Для вызова DLL из InnoSetup требуется прямой экспорт функции.

Проблема та же самая, например, при попытке использовать управляемые библиотеки DLL из C++. Это не может быть сделано за исключением случаев использования COM, как описано здесь.

Вы должны использовать родную Win32 DLL.

Другие вопросы по тегам