我可以将Word文档附加到Windows应用程序吗?

时间:2017-01-10 20:31:07

标签: c# winforms ms-word

我有一个Windows窗体应用程序,我在Word中编写了一本包含有用图片的大量手册。有没有办法在.exe中包含.docx,以便用户可以单击应用程序中的按钮以在Word中打开手动?

1 个答案:

答案 0 :(得分:3)

而不是"附加"我认为你的意思是"嵌入"。

是的,您可以将其存储为嵌入式资源。

在.NET Win32程序中嵌入资源有三种方法:

  • 作为Win32 PE资源。这在.NET代码中并不容易使用,因为它们没有内置的API(所以你需要P / Invoke(DllImport)),但这意味着其他程序可以访问资源。
  • 作为直接存储的嵌入式资源流,可以使用.NET Framework中的Assembly.GetManifestResourceStream() API访问它。这是最快的方式(因为它作为Stream而不是字节数组公开,所以它不会被不必要地加载到内存中。)
  • 作为.NET Byte[] / .resx资源中的.resources。这不是最理想的,因为该文件包含在另一个抽象中,并以Byte[]而不是Stream公开,但您可以更轻松地管理Visual Studio中的文件。

我推荐GetManifestResourceStream方法,所以这样做:

  1. 在您的项目中,在项目中包含Word文档(解决方案资源管理器>显示所有文件>(您的文档,右键单击)>包含文件
  2. 选择文件,然后打开属性,然后在" Build Action"选择"嵌入式资源"
  3. 请注意,项目根相对文件夹路径将转换为资源的以点分隔的名称前缀,因此如果文件为My Project\Documents\Readme.doc,则资源名称将为Documents.Readme.docYou can override this,但您需要直接编辑.csproj文件(使用<LogicalName>元素)。
  4. 然后构建,您的*.doc文件将被嵌入。
  5. 在您的代码中,执行以下操作:

    // use a GUID generator to create a new GUID in a string literal (do not run `Guid.NewGuid()` or `new Guid()` at runtime!) to create a globally unique filename so you don't accidentally overwrite other files
    const String _myFileName = "12345.doc"; 
    
    static void ShellInvokeReadmeDocument() {
    
        String destFileName = Path.Combine( Path.GetTempPath(), _myFileName );
        if( !File.Exists( destFileName ) ) {
    
            Assembly assembly = Assembly.GetExecutingAssembly(); // change as appropriate
            using( Stream source = assembly.GetManifestResourceStream("Documents.Readme.doc") )
            using( Stream destination = File.OpenWrite( destFileName ) ) {
    
                source.CopyTo( destination );
            }
        }
    
        Process.Start( destFileName );
    }
    

    请注意,我建议您不要使用.doc.docx文件,因为无法保证用户将安装Word(除非您知道您的客户会拥有Word)。< / p>

    请注意,Windows中的写字板不一定能够打开.doc个文件!在Windows 7及更高版本上,写字板仅打开.docx个文件,不支持所有格式化选项,只支持一小部分,Windows Vista及更早版本的写字板不支持打开.docx个文件。

    如果您想最大限度地提高兼容性,我建议您使用.pdf文件,以保留打印页面格式和布局,或.rtf文件。

    如果此文件旨在构成帮助或文档文件,那么您应该使用.chm文件,该文件由Windows 98以后的所有Windows版本构建并完全支持 - 您还可以集成{{ 1}}文件与WinForms一起使用&#34;这是什么?&#34;按钮和工具提示(.chm文件不要与Windows Vista后Windows不支持的.chm文件混淆。