2017-01-10 114 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文件混淆)。

相關問題