4

在 Azure Service Fabric Reliable Service 中使用 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 被复制到与服务相同的目录中,就像它在我的开发集群中一样。无法弄清楚为什么在生产中找不到它。

我已尝试按照此答案中的建议设置 PATH 环境变量,并验证它确实已设置 - 不幸的是,这无济于事。

为了让 ASF 获取 DLL,我需要做些什么特别的事情吗?

编辑:还尝试在所有节点上将DLL添加到System32,也没有解决。

4

1 回答 1

8

原来 libsodium-64.dll 依赖于 Visual C++ 运行时,它似乎不存在于 Azure VM 上。Ran Process Monitor如此处所述看到它正在获取“libsodium-64.dll”但在“vcruntime140.dll”上失败 - 仅异常消息就使得这几乎不可能解决。

在 VM 上安装了 Visual C++ Redistributable,现在一切似乎都运行良好。

如果有人碰巧遇到同样的问题,您可以通过将以下扩展添加到 ARM 部署模板中规模集的 VM 配置文件(VMSS -> 属性 -> 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 存储中。

于 2016-07-15T23:43:28.887 回答