Libsodium-net - 无法加载 DLL 'libsodium.dll'

11
我通过NuGet安装了Libsodium-net并能够在我的类中包含Sodium,但是当我尝试运行它时,出现了“System.DllNotFoundException”类型的异常,但未在用户代码中处理。
附加信息:无法加载DLL“libsodium.dll”:找不到指定的模块。(来自HRESULT的异常:0x8007007E)
我只是想运行gitbooks文档中的示例代码。 https://bitbeans.gitbooks.io/libsodium-net/content/password_hashing/index.html
const string PASSWORD = "Correct Horse Battery Staple";
const string SALT = "qa~t](84z<1t<1oz:ik.@IRNyhG=8q(o";
const long OUTPUT_LENGTH = 512;

//this will produce a 512 byte hash
var hash = PasswordHash.ScryptHashBinary(PASSWORD, SALT,      PasswordHash.Strength.Medium, OUTPUT_LENGTH);
2个回答

14

我也遇到了这个问题。解决方案的第一部分是像@NiklasEkman一样将目录添加到PATH变量中。

但是,当部署到我们的QA环境时,我遇到了完全相同的错误。在花费数小时处理权限,尝试确定dll文件是否在正确的目录中等方面后,我遇到了这篇文章:

https://mspcontrol.org/forums/topic/add-user-error-unable-to-load-dll-libsodium-64-dll/#post-4765

您必须安装Visual C ++ Redistributable for Visual Studio 2015 (13 Mb) https://www.microsoft.com/en-us/download/details.aspx?id=48145

最终这为我解决了这个问题。


1
有几个问题困扰了我:1)您必须安装与您的进程相同的 Visual C++ Redistributable 目标,无论是 x64 还是 x86。请注意,如果您在启用了“启用 32 位应用程序”选项的 ASP.NET 应用程序池中运行,则需要 x86。2)安装 Redistributable 后,您需要重新启动 IIS(或者可能只需重新启动应用程序池)。 - Jordan Rieger
1
此外,由于该库可能需要安装单独的依赖项(即不是正常的XCOPY部署),因此我认为更实际的做法可能是将libsodium.dll和libsodium-64.dll复制到C:\Windows\System32或C:\Windows\SysWOW64目录中,而不是去修改PATH环境变量。这将取决于您特定的部署要求,但对我来说,这是最好的选择。 - Jordan Rieger
Visual Studio 2017 的 Visual C++ 可再发行程序包已经替换了 2015 版本。我猜应该包含了所有内容,但是这个解决方案对我来说不起作用。 - Tigerware

14

我曾经也遇到同样的问题,通过Jørn Wildt在这里给出的答案解决了它。

事实证明,ASP.NET不会对非托管DLL(如libsodium.dll和libsodium-64.dll)进行影子复制。

Sodium.dll(托管代码)尝试从与Sodium.dll影子副本相同的目录中加载DLL(这是行不通的),或者从PATH环境变量的某些目录中加载。

我的解决方法是在调用任何Sodium代码之前将AppDomain \Bin目录添加到路径中:

string path = Environment.GetEnvironmentVariable("PATH");
string binDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Bin");
Environment.SetEnvironmentVariable("PATH", path + ";" + binDir);
正如Reuben在回答中评论的那样,我将上述代码添加到了Global.asax文件的Application_Start方法中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接