TheOneTrueMongoloid Ответов: 1

Получение 'badimageformatexception' при загрузке libsodium.dll в visual studio 17


У меня есть libsodium-net NuGet, загруженный в мое PoC-решение, и есть 32-битные и 64-битные версии libsodium.dll файлы в соответствующих каталогах (System32 и SysWOW64). Всякий раз, когда я иду, чтобы запустить программу в режиме отладки, я получаю ошибку BadImageFormatException. Достаточно ли этого, чтобы иметь libsodium.dll файлы в соответствующих системных каталогах, и я просто упускаю что-то еще, или мне нужно иметь копии этих dll-файлов в моем решении?

Вот моя процедура, и, по крайней мере, согласно intellisense, все здесь подключено правильно.
Option Explicit On
Imports Sodium
Imports System.Text

Public Class Form1
    Dim textToEncrypt, decrypted As String
    Shared encoder As New UTF8Encoding

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim key, hashedBytes, salt As Byte()

        textToEncrypt = TextBox1.Text
        Dim textBytes As Byte() = encoder.GetBytes(textToEncrypt)
        hashedBytes = CryptoHash.Sha512(textToEncrypt)

        salt = PasswordHash.ScryptGenerateSalt()
        key = SecretBox.GenerateKey()

        Dim passEnc As Byte() = PasswordHash.ScryptHashBinary(textBytes, salt, PasswordHash.Strength.Medium)

        TextBox2.Text = Convert.ToBase64String(passEnc)
        TextBox6S.Text = Convert.ToBase64String(salt)
        TextBox3PBK.Text = Convert.ToBase64String(key)
        TextBox5H.Text = Convert.ToBase64String(hashedBytes)
    End Sub
End Class


Что я уже пробовал:

Я пробовал компилировать с использованием конфигураций сборки x86 и x64 с тех пор, как прочитал здесь: c# - BadImageFormatException во время .Чистая проблема загрузки сборки - переполнение стека[^] это, это может быть причиной этой ошибки, но я все равно получил ту же ошибку в обеих областях.

Я также попробовал ответить на этот вопрос, который нашел здесь: Как включить libsodium.net ВКЛ ASP.NET для включения libsodium-net в VS[^], где он сказал, чтобы установить Visual C++ Redistributable 2015, а также, но проблема есть, когда я попытался это сделать, я получил ошибку от установщика, заявив, что он уже установлен на моем компьютере. Когда я проверил, однако, все, что у меня было, это версии 2008, 2013 и 2017 годов, а не 2015 года, так что я все еще не понимаю, почему я не мог установить распространяемый файл 2015 года, но это в другой раз, я полагаю, если только это не единственное решение, которое будет работать, и в этом случае кто-нибудь знает, что может вызвать эту проблему?

Я проверил NuGet manager и оба libsodium и Sodium.Ядро находится в актуальном состоянии и работает на текущих стабильных моделях. Я упомянул каталоги System32 и SysWOW64 только потому, что это было то, что я пробовал, пытаясь найти решения, которые нашли другие люди, и размещение библиотек DLL в этих каталогах решило проблему для одного или нескольких человек, поэтому я попробовал это сделать, чтобы посмотреть, решит ли это и мою проблему, но этого не произошло.

1 Ответов

Рейтинг:
1

Dave Kreskowiak

Среда выполнения 2017 года - это всего лишь обновление версии 2015 года. Если вы устанавливаете 2017, у вас есть 2015. Номер версии для 2015 года-14.0, тогда как для 2017 года-14.4.

Если у вас установлен 2017 год, то вместе с ним уже есть и 2015-й.


Что касается вас, то это главный вопрос. Ни малейшего понятия. Каждый раз, когда я это вижу, это происходит потому, что вы пытаетесь смешать 32 - и 64-битный код в одном и том же процессе.


TheOneTrueMongoloid

Спасибо за информацию о версии Visual C++. Это заставляет меня чувствовать себя немного лучше, по крайней мере. Считаете ли вы, что полная деинсталляция и переустановка Nugets Sodium-Core и libsodium сделают что-нибудь, чтобы решить эту проблему?

Dave Kreskowiak

Нет. Переустановка почти никогда не решает проблем.

TheOneTrueMongoloid

I didn't think so, but when grasping at straws... So, is there a way to tell if I'm pulling from the x64 or x86 bit versions of libsodium from the code editor? I'm still very new to software development at this level (I'm not a dev by trade, so I'm largely self-taught) and as a result, I'm sort of groping in the dark when it comes to defining whether an app is x64 or x86. I have an x86 and x64 platform build profile set up, but since I didn't see where to actually set them up, I had to use the "Copy settings from Any CPU" option when setting them up, and I don't know if that actually did anything. Google hasn't been much help in that department either. Do you have a link to an article that explains that in detail?

Dave Kreskowiak

В обозревателе решений дважды щелкните узел свойства. На появившейся странице нажмите кнопку Нет на вкладке сборка. Вы ищете "цель платформы". Если он говорит любой процессор, измените его на x86, создайте свое приложение и повторите попытку.

TheOneTrueMongoloid

Первоначально он говорил "любой процессор", когда я делал первую сборку несколько недель назад, но затем я создал платформы сборки x86 и x64 (копируя из любого процессора, потому что я не видел никаких конфигураций, кроме копирования из... и "пустого", что не казалось хорошей идеей), и независимо от того, строю ли я на x86 или x64, я все равно получаю ту же ошибку.

Dave Kreskowiak

Возвращаясь к тому, что вы разместили изначально, вы сказали, что положили его .DLL находится в папках System32 и SysWow64? Почему? Обычно вы просто оставляете файлы в покое, и они окажутся в папках bin\Release или bin\Debug вместе с вашим исполняемым файлом.

А еще лучше, какие пакеты libsodium вы установили? Похоже, это обертки вокруг libsodium .файл DLL. Может быть, так оно и есть .DLL-файлы, которые они обертывают, должны находиться в том же каталоге, что и ваше приложение, а не где-то под Windows.

TheOneTrueMongoloid

В конце моего поста я обратился к тому, почему они находятся в каталогах Sys32 и SysWOW64. Это решило эту проблему для кого-то другого, поэтому я попробовал, и это не сработало для меня. Что касается того, где установлен libsodium, я установил его через Visual Studio NuGet manager, поэтому он установил libsodium туда, куда их загружает NuGet manager.

Dave Kreskowiak

Я просто попробовал быстрое приложение, которое написал, используя пакет "libsodium-net", и не столкнулся с ним ни с какими проблемами. Я ничего не переписывал .DLL-файлы в папки System и SysWOW64.

Вы можете попробовать удалить его .DLL-файлы, которые вы скопировали, затем выполните деинсталляцию пакета на установленной вами библиотеке и попробуйте повторно добавить пакет "libsodium-net" обратно в проект.

TheOneTrueMongoloid

Спасибо, Дэйв. Я попробую это сделать. Из любопытства, устанавливаете ли вы libsodium-net через Диспетчер NuGet в Visual Studio или загружаете репозиторий Git и устанавливаете его вручную?

Dave Kreskowiak

NuGet для.