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

我有一个基于ASP.NET(使用.asmx)文件的旧web服务构建。 我需要使用sodium.net – 不幸的是它在加载依赖的libsodium.dll文件时失败了。 关于我犯错的任何想法?

  • 我通过NuGet添加了libsodium.net。

  • 我已将64位DLL重命名为“libsodium.dll”(以及其他命名约定)。

  • 我试图直接引用libsodium.dll,但VS拒绝它(不是有效的DLL)。 所以我把它添加为“内容”而不是“复制到输出”。

  • 构建后,我可以看到网站/ Bin文件夹包含sodium.dll(.NET程序集)和libsodium.net。

  • 当我尝试使用libsodium.net时,我得到:

    ERROR 2015-02-02 11:14:27,118 13798ms [41] CabinetService doRequest – Caught:’Sodium.SodiumCore’的类型初始化程序引发exception。 System.TypeInitializationException:’Sodium.SodiumCore’的类型初始值设定项引发了exception。 —> System.DllNotFoundException:无法加载DLL’libsodium.dll’:找不到指定的模块。 (来自HRESULT的exception:0x8007007E)位于Sodium.SodiumCore..cctor()的DynamicDllInvokeType.sodium_init()—内部exception堆栈跟踪的结束—位于Sodium.SSecretBox.Create(字节)处的Sodium.SodiumCore.LibraryName() []消息,Byte [] nonce,Byte []键)在Macaroons.SecretBoxCryptoAlgorithm.Encrypt(Byte []键,Byte [] plainText)中的c:\ Projects \ Macaroons.Net \ Macaroons.Net \ SecretBoxCryptoAlgorithm.cs:line 58

所以它找不到“libsodium.dll”,即使它在Bin文件夹中。 我也尝试删除对“sodium.net”的依赖,在我收到运行时错误后说“sodium.net”丢失了 – 当我重新添加它时,该错误消失了,我得到了上面的那个(表示“sodium.net”正确加载)。

所以我在“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files \ cabinetservice”中打开网站shadow文件夹并搜索“sodium”。 唯一的结果是某些子文件夹中的“sodium.dll”。 没有“libsodium.dll”。

显然,ASP.NET在创建网站的卷影副本时会忽略“libsodium.dll”文件。

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

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

如何让ASP.NET了解依赖关系?

事实certificate,ASP.NET不会制作非托管DLL的卷影副本,例如libsodium.dll和libsodium-64.dll。

Sodium.dll(托管代码)尝试从与Sodium.dll的阴影副本(无法正常工作)相同的目录中加载DLL – 或者在PATH环境变量的目录中加载某些DLL。

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

// 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月更新(来自Jordan Rieger的回答):

请注意,您可能还需要在服务器上安装Microsoft Visual C ++ 2015 Redistributable(x64或x86目标,具体取决于您的进程)。

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

请注意,您可能还需要在服务器上安装Microsoft Visual C ++ 2015 Redistributable(x64或x86目标,具体取决于您的进程)。

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

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