none
C# windowForm 如何打包成exe檔 RRS feed

  • 問題

  • 您好:

    我想要 用C#連資料庫,定期撈資料mail 給特定人 (利用WIN排程)

    初期,我先建一個 form1,使用app.config建立連線字串

    接著 於FORM中,新增dataGridView1,到資料進去

    目前為止OK,

    請問該如何將相關的 檔案,包成一個exe檔呢?

    這exe檔是否可 類似 解壓縮 回原來相關檔案?

    謝謝!

    2019年2月28日 下午 12:46

解答

  • (1) 從 Program.cs 裡就可以看出來起始 form 在哪啦

        static class Program
        {
            /// <summary>
            /// 應用程式的主要進入點。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

    (2) 世上沒有完美的加密,但麻煩的事情會降低別人的慾望,除非很值得。

    (3) 如果你把密碼寫在程式碼裡,那當然是這樣。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 softballnow 2019年3月3日 上午 02:09
    2019年3月1日 上午 08:08
    版主
  • 你若是網路資料庫,應該另外規劃連線字串的組成方式,例如執行時透過網路取得加密的連線字串,再另外解密後執行。

    app.config 可以設定連線字串加密,但是使用 .Net 內建方式解密,所以可以慢慢測試你加解密方式及加解密金鑰,所以你規劃連線字串透過網路生成時,要規劃加解密金鑰生成方式,比較安全。

    當然,不要開網路資料庫最安全,你只要開了被 port scan 到,無時無刻都會有企圖登入的訊息,所以一般來說,網路資料庫只在內網開放,比較好做安全管制,透過網際網路會要求透過 VPN 存取,或是透過 Web Service 或其他方式做第三層元件管制,以利確保資料庫安全。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 softballnow 2019年3月3日 上午 02:09
    2019年3月1日 上午 10:08
  • 你的 1/2/3 有內建:

    https://docs.microsoft.com/zh-tw/dotnet/framework/data/adonet/connection-strings-and-configuration-files

    我是說用內建的方式因為使用預設的解密法,只要測不同的金鑰即可,最好是加解密法都自訂,才不會輕易被破解。

    當然,動態產生更好,動態產生即使相同連線字串,每次都不一樣,可以讓企圖破解的人更困擾。

    但是,資料庫提供網路服務,誰跟你慢慢破連線字串?一般直接對資料庫做窮舉法,直接破密,你可以把資料庫放到 public ip 上,大概一個月就會開始有人企圖登入了。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 softballnow 2019年3月3日 上午 02:09
    2019年3月1日 上午 11:39

所有回覆

  • (1) 你的程式建置後,預設就會在專案目錄的底下的 bin\debug 或 bin\release  (依據你的建置設定是 debug/release) 產生 exe 檔。

    (2) 但是 App.config 會是一個獨立於 exe 以外的檔案 ,因為這樣才能直接修改不用重新建置。

    (3) C# 編譯後的程式碼是以一種 IL Code 的形式存在,他是可以反編回 C# ,但不會是整個專案,只有單純程式碼的部分。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年2月28日 下午 12:57
    版主
  • 唯讀的檔案可以封裝到 exe 的資源內,但資料庫不行。

    透過資源方式封入 exe 內的,不能解壓縮,但是可以用資源編輯器抽出來。

    另外有透過工具程式封裝成單一 exe 的,通常工具本身會提供反解工具。

    有法故有破,要讓人不能解讀,須把檔案加密,再於讀出時解密,解密金鑰要動態產生或自訂家解密,比較不容易被破解。

    反組譯工具有,但能保護的也很有限。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年2月28日 下午 03:16
  • 如果您是想要讓特定的使用接收資料庫的最新內容, 可以考慮建立可訂閱的報表, 請參考:

    Subscriptions and Delivery (Reporting Services)

    2019年2月28日 下午 11:11
  • 您好:

    謝謝,

    我到專案下bin\Debug,的確有 exe ,且可直接執行

    但將exe 複製到其他地方後,就無法執行了

    除非我把exe.config 一起COPY 過去 ( 所以 SQL或MAIL等其他 參考 應該有包入 EXE?  是否自動包入 ? )

    但這樣 連線字串,就容易被 得知了

    類似這樣,我該如何整體打包成一個EXE 檔

    要如何 於打包時 加密呢?

    謝謝!

    2019年3月1日 上午 02:22
  • 你的 app.config 如果只放連線字串,你可以直接放到程式裡面,或用資源檔放入程式裡面。

    app.config 裡面放連線字串只是給快速開發用的,正式開發並不適合,這讓有意破解的人只要玩這個檔就可以了。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2019年3月1日 上午 04:39
  • 您好:

    謝謝您。

    我於專案內,新增一個class測試放連線字串,OK。

    1.想再請教,整個方案-->只會產生一個 exe檔?

      那若裡面有多個form,要從哪邊設定起始?

    2.若app.config 會被拿去玩,那聽說有加密的功能,這樣也危險嗎?

    3.那若是以後密碼改了,是否所有exe要重新產生一次,還是有其他做法呢?

    謝謝!

    2019年3月1日 上午 07:45
  • (1) 從 Program.cs 裡就可以看出來起始 form 在哪啦

        static class Program
        {
            /// <summary>
            /// 應用程式的主要進入點。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
        }

    (2) 世上沒有完美的加密,但麻煩的事情會降低別人的慾望,除非很值得。

    (3) 如果你把密碼寫在程式碼裡,那當然是這樣。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 softballnow 2019年3月3日 上午 02:09
    2019年3月1日 上午 08:08
    版主
  • 你若是網路資料庫,應該另外規劃連線字串的組成方式,例如執行時透過網路取得加密的連線字串,再另外解密後執行。

    app.config 可以設定連線字串加密,但是使用 .Net 內建方式解密,所以可以慢慢測試你加解密方式及加解密金鑰,所以你規劃連線字串透過網路生成時,要規劃加解密金鑰生成方式,比較安全。

    當然,不要開網路資料庫最安全,你只要開了被 port scan 到,無時無刻都會有企圖登入的訊息,所以一般來說,網路資料庫只在內網開放,比較好做安全管制,透過網際網路會要求透過 VPN 存取,或是透過 Web Service 或其他方式做第三層元件管制,以利確保資料庫安全。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 softballnow 2019年3月3日 上午 02:09
    2019年3月1日 上午 10:08
  • 您好:

    請問您是說,

    1.我先用 加密程式,編譯過 帳號 及密碼 ==>亂碼 ;貼到app.config 內的 字串值

    2.於程式碼中,取得 App.config 內的 帳號與 亂碼

    3.將此亂碼 解密後, 轉成 SQL連線 字串 來用嗎?

    而這個 App.config 或其他檔案; 可能放在同一個地方 或 其他地方 。

    謝謝!

    2019年3月1日 上午 11:31
  • 你的 1/2/3 有內建:

    https://docs.microsoft.com/zh-tw/dotnet/framework/data/adonet/connection-strings-and-configuration-files

    我是說用內建的方式因為使用預設的解密法,只要測不同的金鑰即可,最好是加解密法都自訂,才不會輕易被破解。

    當然,動態產生更好,動態產生即使相同連線字串,每次都不一樣,可以讓企圖破解的人更困擾。

    但是,資料庫提供網路服務,誰跟你慢慢破連線字串?一般直接對資料庫做窮舉法,直接破密,你可以把資料庫放到 public ip 上,大概一個月就會開始有人企圖登入了。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    • 已標示為解答 softballnow 2019年3月3日 上午 02:09
    2019年3月1日 上午 11:39
  • 您好:

    謝謝,不過 金鑰 這一段還沒有概念, 在另外收巡看看  有無範例來了解!

    謝謝!

    2019年3月3日 上午 02:10