2017-01-10 85 views
-1

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

+0

当然,你只需要将它包含在你的输出目录中,并使用shell执行的process.start命令从那里打开它。 –

+0

好的谢谢。我会研究一下。 – Forklift

+1

@ rory.ap是正确的,但我推荐使用PDF而不是Word文档。用户有更好的机会阅读它。例如,我在任何使用的计算机上都没有Word的副本。 – adv12

回答

1

而不是“附加”我想你的意思是“嵌入”。

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

有三种方式嵌入资源.NET Win32程序:

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

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

  1. 在你的项目中,包括在项目(Solution Explorer中的Word文档>显示所有文件>(您的文档,右键单击)>包括文件
  2. 选择该文件,然后打开属性和“生成操作”下选择“嵌入的资源”
  3. 注意项目根相对文件夹路径将被翻译成你的资源点分隔的名称前缀,所以如果文件是My Project\Documents\Readme.doc那么资源nam e将是​​。 You can override this,但您需要直接编辑您的.csproj文件(使用<LogicalName>元素)。
  4. 然后构建,并且您的*.doc文件将被嵌入。

在你的代码,这样做:

// 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(除非你知道你的客户将拥有它)。

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

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

如果该文件是为了构成帮助或文档文件,那么你应该使用一个.chm文件,而不是,这是结构化的,并通过从Windows 98开始的所有Windows版本完全支持 - 你也可以集成与WinForms的.chm文件“这是什么?”按钮和工具提示(.chm文件不要与Windows Vista之后Windows不支持的.hlp文件混淆)。

相关问题