首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将libsodium.net包含在ASP.NET上

如何将libsodium.net包含在ASP.NET上
EN

Stack Overflow用户
提问于 2015-02-02 10:45:25
回答 2查看 7.2K关注 0票数 10

我在ASP.NET (使用.asmx)文件上构建了一个旧的webservice。我需要使用sodium.net -不幸的是,它在加载依赖的libsodium.dll文件时失败了。对我做错了什么有什么想法吗?

  • 我通过libsodium.net添加了NuGet。
  • 我已将64位DLL重命名为"libsodium.dll“(以及其他命名约定)。
  • 我试图直接引用libsodium.dll,但是VS拒绝它(不是一个有效的DLL)。因此,我将其添加为"content“,而不是”复制到输出“。
  • 构建之后,我可以看到网站/Bin文件夹同时包含sodium.dll ( .NET程序集)和libsodium.net。
  • 当我尝试使用libsodium.net时,我得到: 错误2015-02-02 11:14:27,118 13798ms 41 CabinetService doRequest -doRequest:Sodium.SodiumCore的类型初始化引发了一个异常。System.TypeInitializationException:“Sodium.SodiumCore”的类型初始化程序引发了一个异常。-> System.DllNotFoundException:无法加载DLL 'libsodium.dll':找不到指定的模块。(来自HRESULT: 0x8007007E的异常)在c:\Projects\Macaroons.Net\Macaroons.Net\SecretBoxCryptoAlgorithm.cs:line 58中DynamicDllInvokeType.sodium_init() at Sodium.SodiumCore..cctor() -内部异常堆栈跟踪-在Sodium.SecretBox.Create(Byte[] message,Byte[] nonce,Byte[] key)的Sodium.SodiumCore.LibraryName() at Sodium.SecretBox.Create( Byte[] message,Byte[]nonce,Byte[] key )

因此,即使在Bin文件夹中,它也找不到"libsodium.dll“。我也尝试删除了对"sodium.net“的依赖,在我收到一个运行时错误说"sodium.net”缺失之后-当我重新添加该错误时,该错误消失了,我得到了上面的一个错误(正确地指示了"sodium.net“加载)。

因此,我打开了"C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\cabinetservice中的网站阴影文件夹,并搜索“and”。唯一的结果是某个子文件夹中的"sodium.dll“。没有"libsodium.dll“。

因此,显然ASP.NET在创建网站的影子副本时忽略了"libsodium.dll“文件。

我还尝试将libsodium.dll (32位)添加到C:\Windows\System32 32和libsodium.dll (64位)到C:\Windows\SysWOW64 64。同样的结果。

我试过C:\Windows\Microsoft.NET\assembly\GAC_32\libsodium和C:\Windows\Microsoft.NET\assembly\GAC_64\libsodium.同样的结果。

如何使ASP.NET意识到依赖关系?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-31 09:50:45

事实证明,ASP.NET不会复制非托管DLL,如libsodium.dll和libna-64.dll。

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

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

代码语言:javascript
复制
// Make it possible to load unmanaged libsodium DLLs that .NET does not make shadow copies of.
// -> Simply point the "path" variable to the Bin directory.
string path = Environment.GetEnvironmentVariable("PATH");
string binDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Bin");
Environment.SetEnvironmentVariable("PATH", path + ";" + binDir);

更新2018年1月(来自约旦Rieger的答复):

请注意,您还可能需要在服务器上安装MicrosoftVisualC++ 2015可再发行版(取决于您的流程,x64或x86目标)。 安装可再发行版后,不要忘记重新启动应用程序池(我做了IIS重置)。

票数 20
EN

Stack Overflow用户

发布于 2018-01-24 23:16:19

请注意,您还可能需要在服务器上安装MicrosoftVisualC++ 2015可再发行版(取决于您的流程,x64或x86目标)。

安装可再发行版后,不要忘记重新启动应用程序池(我做了IIS重置)。

请看我对https://stackoverflow.com/a/45078280/284704的评论。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28275944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档