如何在应用程序中嵌入CHM文件

本文关键字:CHM 文件 应用程序 | 更新日期: 2023-09-27 17:57:40

大家好,我刚刚完成了一个我已经处理了一段时间的应用程序。可能是我迄今为止做过的最复杂的一个。因此,我想我应该去做一个帮助文档,为用户提供一些信息

我已经创建了一个CHM文件,并设置了一个helpProvider,但现在我的问题是如何将它和HHC(目录)文件包含在我的应用程序中。我觉得要求用户自己复制这两个文件会很痛苦,所以我试图将它们存储为嵌入式资源,然后让应用程序将它们写在当前目录中。

目前,这是我正在使用的代码:

var data = Properties.Resources.RERHelp;
        using (var stream = new FileStream("RERHelp", FileMode.Create))
        {
            stream.Write(data, 0, data.Count() - 1);
            stream.Flush();
        }
        helpProvider1.HelpNamespace = Directory.GetCurrentDirectory() + "''RERHelp''RERHelp.chm";

这很好,但这意味着我必须运行两次,一次是将数据设置为Properties.Resources.RERHelp,另一次是对目录文件。有更好的方法吗?也许有某种方法可以将CHM和HHC文件嵌入到应用程序中,并在不将它们写入磁盘的情况下访问它们?如果这不可能,我认为这是不可能的,还有比我现在更好的方法吗?

谢谢你的帮助!

谨致问候,

Ian

如何在应用程序中嵌入CHM文件

应用程序通常使用安装程序或某种zip存档。这两种方法都允许用户接收应用程序的帮助文件,而不必单独提供它们。

在项目属性-资源下,添加一个文件资源,即:textmag.chm。我使用文件类型Text作为chm的

private void HelpToolStripMenuItem_Click(object sender, EventArgs e)
    {
        string helpFileName = "";
        try
        {
            helpFileName = System.IO.Path.Combine(System.Windows.Forms.Application.StartupPath, "Resources") + @"'TextMag.chm";
            Help.ShowHelp(this, helpFileName);
        }
        catch (Exception ex)
        {
            string xxx = ex.Message;
        }
    }

重要提示:在资源下的chm文件的属性中,"生成操作"必须为"内容"。

哦,哇。原来我也不需要HHC文件。我认为我这样做是因为当我打开帮助对话框时,它会说找不到目录.hhc文件。出于某种原因,我认为除了CHM之外,它还需要它。我最初只是制作了一个方法来传递资源,以防止冗余,并为CHM和HHC调用了一次,但后来我注意到了这一点:

data.Count() - 1

我不知道为什么会有-1,我找到的解决方案有它,所以我就把它留在那里了。当我删除它时,程序运行了,写出了那个文件,然后可以阅读它以获得帮助文档,而不会抱怨丢失的HHC。一切都很好。谢谢大家的建议!

因此解决方案是:
1) 将chm文件复制到所需的项目文件夹
2) 在Visual C#解决方案资源管理器中,将现有项添加到项目中(chm文件)
3) 选择"项目"菜单,然后选择"项目属性"
4) 添加现有资源
5) 添加以下代码并连接到帮助菜单项。

   private void WORKING_HELP()
    {
        string filePath = Directory.GetCurrentDirectory() + "''BlitzHelp.chm";
        try
        {
            //Check if already exists before making
            if (!File.Exists(filePath))
            {
                var data = Properties.Resources.BlitzHelp;
                using (var stream = new FileStream("BlitzHelp.chm", FileMode.Create))
                {
                    stream.Write(data, 0, data.Count());
                    stream.Flush();
                }
                MessageBox.Show("file made");
            }
        }
        catch
        {
            //May already be opened
        }
        Help.ShowHelp(this, filePath);
    }