爲了學習的目的,我在c#和winforms中開發了一個類生成應用程序。我認爲可以很好地包含允許在腳本中使用應用程序的命令行模式。我應該在應用程序中包含命令行模式嗎?
在我的應用程序中包含命令行模式是一種很好的做法嗎?最好是有兩個不同的程序,一個用於命令行,一個用於GUI?
爲了學習的目的,我在c#和winforms中開發了一個類生成應用程序。我認爲可以很好地包含允許在腳本中使用應用程序的命令行模式。我應該在應用程序中包含命令行模式嗎?
在我的應用程序中包含命令行模式是一種很好的做法嗎?最好是有兩個不同的程序,一個用於命令行,一個用於GUI?
實際上有一個C#應用程序是控制檯和GUI都有問題。控制檯應用程序(/t:exe)已啓動,然後命令提示符等待它們完成。 GUI應用程序(/t:winexe)命令外殼程序啓動它們,然後立即返回。雖然您可以從「控制檯」應用程序創建和運行表單,但它始終會顯示後臺控制檯。另一方面,'Forms'應用程序沒有連接stdin,stdout和stderr,雖然它們可以像命令行工具一樣工作並處理命令參數,但它們嵌入腳本時會遇到問題(因爲標準輸入/輸出不是迷上了)。
如果您想從GUI驅動的應用程序和腳本/管道批處理中公開功能,最好的方法是將您的功能編譯到類庫中,然後構建兩個單獨的應用程序(一個GUI一個控制檯),利用該庫。
是的。如果您認爲該程序在腳本環境中很有用,那麼可以包含一個命令行模式(無需UI),以便在腳本中使用。
它不必是一個單獨的應用程序,但它可以。無論你是否願意這樣做完全取決於你。我想如果你有兩個應用程序,他們會共享相同的邏輯程序集,但接口(其中一個GUI和另一個命令行)只會有所不同。
在windows平臺上創建一個與控制檯應用程序行爲正確的應用程序可能會有問題,這是windows內核體系結構的一個問題,因爲它們被認爲是兩種不同類型的應用程序(它們有一個不同的子系統,編譯器或鏈接器選項)。您仍然可以手動重定向IO並通過win32函數AllocConsole()和朋友從win32應用程序打開控制檯,但這也有一些問題。有關更多信息,請參閱This Old New Thing post。
我應該儘管雷蒙德已經發布了這個已經大聲笑 – 2009-07-13 01:12:43
如果您希望您的實用程序/腳本在腳本中運行,您可以將它公開爲COM。
許多用於windows的腳本語言都無法直接使用COM對象。
我不是一個C#程序員,但是當我在C++編程,我覺得最有用的:
1)創建兩個與C共享庫以及C++ API,用於執行核心應用功能。
2.)創建一個或多個shell解釋器可訪問的命令行二進制文件。
3.)爲典型的最終用戶創建一個GUI應用程序,用庫實現(而不是通過調用二進制文件)。
這將應用程序的邏輯從接口分離到應用程序,並允許第三方開發人員爲相同的應用程序功能創建替代接口。它還可以輕鬆編寫腳本,同時迎合想要一個漂亮,閃亮的GUI的典型最終用戶。
我同意michaelsafyan關於創建具有核心功能的庫。
我想補充的是,你應該檢查出PowerShell cmdlet。
許多命令行活動將遷移到PowerShell,它會帶來很多表格。
我經常創造這樣的實用程序的API。如果我需要從簡單的命令行工具中使用它,那很簡單 - 它只是調用API。如果命令行過於複雜,那麼可能是Winforms應用程序 - 也可以調用API的時候了。如果我想從PowerShell或MSBUILD任務中使用它,那麼它們仍然很容易 - 它們只是調用API。
我同意@Remus Rusanu。
您應該創建一個核心功能的類庫,然後爲此構建GUI應用程序(包裝器)。
和它的一個另一個好處是,你甚至都不需要創建一個命令行應用程序,你可以使用PowerShell訪問您的.NET的DLL功能..
你可以找到在here
一個例子另一個好主意是嵌入腳本語言。然後你的程序可以通過一個腳本來控制,並且你可以免費獲得腳本語言的所有邏輯,分支等等。
有什麼可以嵌入的選擇。 Lua是最受歡迎的遊戲之一,僅用於此目的,是一個很好的選擇。
但是,對於通用應用程序,我會仔細研究嵌入Python。 Python非常流行,你會有更多的人願意爲你的應用程序編寫腳本。
如果應用程序增強了可用性和舒適性,則應在應用程序中包含命令行界面, 。例如,調用CLI命令可能會更快,然後啓動GUI,瀏覽幾個菜單層以達到相同的功能。 您可能會問您的應用程序的用戶,如果他們覺得有用的CLI模式。
在Windows上結婚CLI & GUI有些話: 一個Windows應用程序可以是一個GUI應用程序或控制檯應用程序,但不都。這是一個操作系統問題,可能對此無能爲力。 Windows中的控制檯子系統非常糟糕,PowerShell沒有改變這一點。在Windows
你實現選項:
提供兩個文件:一個.COM與控制檯,一個.exe文件與GUI。 由於命令行上的可執行探測,com文件將在exe之前執行。
編譯與控制檯模式的GUI應用程序,那麼你可以稱之爲FreeConsole()來關閉它的GUI開始之後。 這有點煩人,但有效。不好:現在你有一個閃爍的控制檯窗口。臨:還是一個文件。
您也可以在winexe應用程序中使用一些win32-api內容(AllocConsole/AttachConsole)創建控制檯輸出窗口,但是由於它沒有指定正確的子系統,因此仍然存在一些問題。 – 2009-07-13 01:01:12
@Jasper:當然,我認爲你甚至可以在指數爲0,1和2的FCB之後走,但是我真的會遠離這一點,只是順其自然,而不是與當前的上游戰鬥;) – 2009-07-13 01:10:31
我從來沒有需要編寫一個既運行GUI又運行命令行的應用程序,我從來沒有意識到它實現起來如此有問題。非常翔實的迴應。 – 2009-08-05 19:12:18