最近用到了GeckoFx的下载功能, 从网络上找到了一些代码复制运行, 发现有时候会报COM调用错误的异常, 经查找发现是GeckoFx的接口发生更新了, 之前的接口已经弃用, 下面贴上经测试可用代码:
首先先 注册下载事件:
Gecko.LauncherDialog.Download += this.LauncherDialog_Download;
然后实现下载事件方法:
private void LauncherDialog_Download(Object sender, Gecko.LauncherDialogEvent e)
{
uint flags = (uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_NO_CONVERSION |
(uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_REPLACE_EXISTING_FILES |
(uint)nsIWebBrowserPersistConsts.PERSIST_FLAGS_BYPASS_CACHE;
SaveFileDialog dlg = new SaveFileDialog
{
FileName = e.Filename
};
if (dlg.ShowDialog(this.ParentForm) == DialogResult.OK)
{
nsIURI source = IOService.CreateNsIUri(e.Url);
nsIURI dest = IOService.CreateNsIUri(new Uri(dlg.FileName).AbsoluteUri);
nsAStringBase t = new nsAString(Path.GetFileName(dlg.FileName));
nsIWebBrowserPersist persist = Xpcom.CreateInstance<nsIWebBrowserPersist>("@mozilla.org/embedding/browser/nsWebBrowserPersist;1");
nsITransfer nst = Xpcom.CreateInstance<nsITransfer>("@mozilla.org/transfer;1");
nst.Init(source, dest, t, e.Mime, 0, null, persist, false);
if (nst != null)
{
persist.SetPersistFlagsAttribute(flags);
persist.SetProgressListenerAttribute(nst);
try
{
persist.SaveURI(source, null, null, (uint)Gecko.nsIHttpChannelConsts.REFERRER_POLICY_NO_REFERRER, null, null, (nsISupports)dest, null);
GuiHelper.MsgBox($"文件[{Path.GetFileName(dlg.FileName)}]已下载成功!");
}
catch (Exception ex)
{
GuiHelper.MsgBox($"下载失败: {ex.Message}.");
}
return;
}
GuiHelper.MsgBox("下载失败: 服务器无响应...");
}
}
与老版本代码的区别是多了下面两行代码:
nsITransfer nst = Xpcom.CreateInstance<nsITransfer>("@mozilla.org/transfer;1");
nst.Init(source, dest, t, e.Mime, 0, null, persist, false);
如果没有这两行代码就会有很大几率出现异常...