在Azure Service Fabric可靠服务中使用libsodium-net实现其所有安全性,在我的本地开发群集上一切正常(尽管我必须将libsodium-64.dll设置为复制到输出目录)
不幸的是,当部署到Azure中的真实群集时,它会引发以下错误:
Unable to load DLL 'libsodium-64.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
我已通过远程桌面检查其中一个节点,并将DLL复制到与服务相同的目录中,就像在我的开发群集中一样。无法解决为什么在生产中找不到它。
我已尝试按照this answer中的建议设置PATH环境变量,并验证它确实设置了 - 遗憾的是这没有用。
为了让ASF拿起DLL,我需要做些什么特别的事情吗?
编辑:还尝试在所有节点上将DLL添加到System32,也没有解决它。
答案 0 :(得分:7)
原来,libsodium-64.dll依赖于Visual C ++运行时,而Azure VM似乎并不存在。按照提到的Process Monitor here看到它正在拾取“libsodium-64.dll”但是“vcruntime140.dll”失败 - 单独的异常消息使得这几乎无法解决。
在VM上安装了Visual C ++ Redistributable,而似乎的所有内容现在都正常工作。
如果有人碰巧遇到同样的问题,您可以通过将以下扩展名添加到ARM部署模板中设置的比例的VM配置文件来解决此问题(VMSS - > properties - > virtualMachineProfile - > extensionProfile - >扩展名:
{
"name": "InstallVCRuntime",
"properties": {
"publisher": "Microsoft.Compute",
"type": "CustomScriptExtension",
"typeHandlerVersion": "1.7",
"autoUpgradeMinorVersion": true,
"settings": {
"fileUris": [
"https://some.blob.storage.url/vc_redist.x64.exe"
],
"commandToExecute": "vc_redist.x64.exe /q /norestart"
}
}
}
它只是抓住安装程序,然后静默运行它。似乎没有可再发行组件的公共链接,所以我只是下载它并将其放入blob存储。