Сначала я подозреваю, что имя файла DLL было каким-то образом искажено.
Я просматривал исходный код и обнаружил:
public partial class MagickSettings
{
#if PLATFORM_x86 || PLATFORM_AnyCPU
public static class X86
{
#if PLATFORM_AnyCPU
static X86() { NativeLibraryLoader.Load(); }
#endif
[DllImport(NativeLibrary.X86Name, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr MagickSettings_Create();
}
Имя DLL генерируется динамически перед вызовом Interop .. .
Процесс был здесь:
namespace ImageMagick
{
internal static class NativeLibrary
{
public const string Name = "Magick.Native";
public const string QuantumName = Quantum + OpenMP;
public const string X86Name = Name + "-" + QuantumName + "-x86.dll";
public const string X64Name = Name + "-" + QuantumName + "-x64.dll";
#if Q8
private const string Quantum = "Q8";
#elif Q16
private const string Quantum = "Q16";
#elif Q16HDRI
private const string Quantum = "Q16-HDRI";
#else
#error Not implemented!
#endif
#if OPENMP
private const string OpenMP = "-OpenMP";
#else
private const string OpenMP = "";
#endif
#if PLATFORM_AnyCPU
public static string PlatformName => Is64Bit ? "x64" : "x86";
public static bool Is64Bit
{
get
{
return IntPtr.Size == 8;
}
}
#endif
}
}
Итак, я проверяю, что NativeLibrary.X86Name = "Magick.Native-Q8-x86.dll"
Итак, я получаю Мое подозрение, что вызов Interop или сама DLL каким-то образом плохи.
Я делаю тестовый код только для вызова начала и конца процесса DLL.
[DllImport(NativeLibrary.X86Name, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr MagickSettings_Create();
[DllImport(NativeLibrary.X86Name, CallingConvention = CallingConvention.Cdecl)]
public static extern void MagickSettings_Dispose(IntPtr instance);
Просмотр экспорта DLL 1.66:
Magick.Native-Q8-x86.dll: 1186 экспортируемых функций
Имя функции: MagickSettings_Dispose Address : 0x10024e90 Относительный адрес: 0x00024e90 Порядковый номер: 548 (0x224) Имя файла: Magick.Native-Q8-x86.dll Тип : Экспортированная функция
Имя функции: MagickSettings_Create Address : 0x10024e10 Относительный адрес: 0x00024e10 Порядковый номер: 541 (0x21d) Имя файла: Magick.Native-Q8-x86.dll Тип : Экспортированная функция
С помощью этого простого кода:
using System;
using System.Runtime.InteropServices;
public sealed class InteropTest
{
[DllImport("Magick.Native-Q8-x86.dll", EntryPoint = "#541", CallingConvention = CallingConvention.Cdecl )]
public static extern IntPtr MagickSettings_Create();
[DllImport("Magick.Native-Q8-x86.dll", EntryPoint = "#548", CallingConvention = CallingConvention.Cdecl)]
public static extern void MagickSettings_Dispose(IntPtr instance);
public InteropTest()
{
IntPtr p = MagickSettings_Create();
MagickSettings_Dispose(p);
}
}
Я получил: Невозможно загрузить DLL 'Magick.Native-Q8-x86.dll': указанная процедура не смогла быть найденным. (Исключение из HRESULT: 0x8007007F).
Итак, у DLL есть проблема.
После исследования я понял, что Magick.Native-Q8-x86.dll имеет огромные зависимости, которые делают cra sh код в зависимости от того, какая у вас ОС (win7,8,10), какая у вас архитектура (32/64) и работает ли вы как настольный компьютер или удаленный сервер.
Требуется время для запуска после всех библиотек DLL которые могут пропустить в конкретной конфигурации, и с каждой новой конфигурацией проблема возникает снова и по-разному.
Создание большой статической c DLL не решает проблему, потому что это определенно генерирует гигантский файл с данными в гигабайтах ...
Это не самый простой способ развертывания сценария.
Я предпочитаю переключиться на переносную версию приложения. Его просто скачать, просто установить (просто дважды щелкнуть), никакого кошмара зависимости. Он работает даже с XP.
Единственный недостаток в том, что он не так интегрирован в код, как могла бы быть Magick. Net.
Вот и все.