C# опубликовать приложение с MediaInfo.dll
Я построил программу, которая будет читать некоторые видео и аудио информацию о файле MKV, используя MediaInfo.dll.
Программа работает идеально при запуске из исходного кода, с DLL в bin
папка.
Теперь я хочу опубликовать свое приложение и иметь возможность продолжать его использовать. MediaInfo.dll
Библиотека больше не найдена. Я пытался поместить его в C:\WIndows\
или в C:\Windows\system32
без удачи Если я запускаю установку (после публикации), программа устанавливается в том же месте (я не хочу этого, но это другая проблема). Я попытался поместить DLL в эту папку тоже.
Код, который выдает мне ошибку:
try{
Handle = MediaInfo_New();
}
catch (Exception ex){
Handle = (IntPtr)0;
Console.Out.WriteLine(ex.ToString());
}
Бросок ошибки System.BadImageFormatException
или же System.DllNotFoundException: Unable to load DLL 'MediaInfo.dll'
,
Есть идеи, где разместить dll?
2 ответа
Вам необходимо развернуть DLL в том же каталоге, в который вы скопировали EXE.
У вас проблемы с BadImageFormatException и вы не видите, как работает c:\windows\system32, потому что вы развертываете свою программу на машине, которая загружает 64-битную версию Windows. Однако ваша программа не может работать в 64-битном режиме, у вас есть зависимость от 32-битного собственного кода. Вам нужно будет это исправить, заставив вашу программу работать в 32-битном режиме. Щелкните правой кнопкой мыши ваш проект EXE, Свойства, вкладка "Сборка", измените целевое значение Platform на x86. Копирование DLL в каталог Windows - очень плохая идея, но на такой машине это c:\windows\syswow64. Всегда отдавайте предпочтение локальному развертыванию, в том же каталоге, что и EXE.
Если после этого у вас по-прежнему возникают проблемы с DllNotFoundException, то вероятная проблема заключается в том, что сам MediaInfo.dll зависит от другой библиотеки DLL. Что довольно часто, DLL, хранящая среду выполнения C, является очень распространенной зависимостью. Если вы не знаете, что это за библиотека DLL, вы можете использовать утилиту ProcMon от SysInternals. Вы увидите, что программа ищет DLL и не находит ее.
Вы можете попробовать один из следующих
1) Поместите MediaInfo.dll
в том же месте, что и исполняемый файл. Убедитесь, что ваша программа создана для правильной целевой платформы. Обычно я видел BadImageFormatException, когда целевая платформа и двоичные файлы имеют несоответствие в архитектуре (x86 v/s x64). Об этом обычно заботятся упаковочные зависимости.
2) Зарегистрироваться MediaInfo.dll
в глобальном кэше сборок целевой машины. Это можно сделать с помощью установщика или просто с помощью gacutil.exe. Это сделает dll видимым для всех сборок на целевой машине.