Re: [問題] WinXP執行.exe視窗程式時出現0xc0000135失敗

作者: fo40225   2016-03-26 04:07:37
※ 引述《banana2014 (香蕉共和國)》之銘言:
: 大家好,
: 我是C#初學者,最近老師教了視窗程式執行檔,但是當我把編譯出來的exe檔放到我的
: Windows XP的系統執行時,它跳出一個錯誤視窗「應用程式正常初始(0xc0000135)失敗。
: 請按一下[確定]終止應用程式。」,上網查了一下原來是我的電腦沒有安裝NET Framework
: 可轉散發套件,所以我就裝了。但是我一直在思考兩個問題:
今年是2016年 WindowsXP是2001年8月24日發布的 距今快15年 是時候升級了
: (1) 該怎樣讓我的程式能在沒有安裝NET Framework的電腦裡也能執行我的視窗程式,我看
: 很多exe視窗程式都不用安裝套件即可正常運行了,為什麼用Visual C#編譯出來的exe視窗
: 程式就要安裝額外的套件才能執行呢?
用Visual Studio所寫的C#程式依賴於.NET Framework 所以一定要有.NET Framework才能
執行
: (2) 或者是說有沒有一種方法可以把NET Framework包在一個壓縮包(像InstallShield之類
: 的)裡頭,當使用者安裝我的軟件時就可以順便安裝NET Framework了。
: 請各位兩個問題都幫我解決一下,因為我還是初學者,所以對這方面還不是很懂
: 謝謝。
關鍵字是 InstallShield 或 Visual Studio installer project 或 ClickOnce
這些方法都有辦法在安裝時一併裝上.NET Framework
====
要讓自己的C#可以在大部分的環境上執行 一個可行的選擇是使用系統內建就有的版本
內建版本
XP 沒有 (安裝光碟有附1.0 最高能安裝4.0)
Vista 2.0/3.0 (更新後會有3.5與4.5.2 最高安裝4.6)
7 3.5 (自動更新會安裝4.5.2)
8 4.5 (windows 8之後3.5要到控制台啟動)
8.1 4.5.1
10 10240 4.6
10 10586 4.6.1
http://msdn.microsoft.com/en-us/library/bb822049.aspx
不建議為了相容性而只選3.5來做學習 因為3.5>4.0>4.5都是大改良
而且微軟也已經不支援4.5.2以前的版本(有bug漏洞不會修的意思)
https://blogs.msdn.microsoft.com/msdntaiwan
/2014/10/20/net-net-3-5-sp1-4-5-1-25/
http://tinyurl.com/zy3mc2j
沒有包袱的話 直接使用最新的比較好
.net各個版本可以說是獨立 也可以說有向下相容
一個系統內是可以安裝各種不同版本的.net的
而.net版本 CLR版本 C#版本 Visual Studio版本(C#編譯器版本) 是不同的概念
http://tinyurl.com/hh24opk
你可以在vs2015中使用C#6的語法 目標.net 2.0
build出來的程式跑在只有安裝.net 4.0沒有3.5(只有CLR4.0沒有CLR2.0)的環境
.net 1.0 1.1 是兩個不同版本 1.1號稱相容1.0 但這兩個版本是黑歷史了
Vista之後的通常不會安裝 如果真遇到程式要1.X
就用下面講的改config 使其在新版執行
.net 2.0 3.0 3.5 都是CLR 2.0 裝3.5就包含2.0 3.0 3.5
.net 4.0 4.5 4.5.1 4.5.2 4.6 4.6.1 都是CLR 4.0 裝最新的會包含之前的版本(不含CLR2.0)
通常會遇到問題的大部分是 3.5以前的要在win8之後上執行
這時要嘛去控制台打開3.5 或是改config
如果要使用不同版本的相容性
做法是將config內的
<supportedRuntime version="vX.0" sku=".NETFramework,Version=vX.X.X" />
給移除
這是因為.net在選擇使用哪個版本來執行的策略為:
如果config檔內有設supportedRuntime
則依照supportedRuntime所設定的版本執行
有多個 則依序尋找 第一個沒安裝就用第二個 依此類推
沒有找到 就跳錯誤
如果config檔內沒有設supportedRuntime
則使用build所使用的版本(專案屬性>應用程式>目標Framework)
沒有安裝 就使用系統內安裝的最新版本
將supportedRuntime給移除之後
好處是 只要系統有安裝.net會嘗試執行 不會因為沒有安裝特定版本就不執行
壞處是 程式可能還是會錯誤
這是因為使用到了新版才有的功能就會出錯
像是2.0才有泛型 3.5才有LINQ 4.0的Task dynamic
舊版程式在新版系統上比較沒有問題 除非有遇到有修改的部分
新版程式在舊版系統上除非完全沒有用到新功能 不然就是出錯
還有的限制像CLR 2.0沒有辦法載入CLR 4.0的組件
.net 4.5之後使用了新版本的PE格式 XP 2003 根本無法執行 等等
: 那想請問一下那些不用安裝任何套件即可執行的exe視窗程式(像MadEdit、AutoStitch…)
: 是用什麼編譯器或軟體做出來的?
微軟的技術中 Visual C++ 靜態連結
就算是Visual C++也一樣依賴於Visual C++ runtime library
很多程式在安裝時 會一併安裝visual c++ redistributable packages就是這個原因
因為系統只內建到VC6的crt版本
使用新版的VC 要不使用靜態連結(可以想成把lib直接跟exe綁一起)
或是用動態連結(使用系統的lib 系統必須要安裝 redist)
靜態連結的大概問題是
1.程式變大 2.記憶體無法共用 3.除非重新建置 不然無法更新crt
1 2以現在的電腦來說不是問題
但3. 如果crt有bug(像是安全性漏洞之類的)
靜態連結的程式無法靠windows update就使用到新版
一定得重新建置 重新佈署 才行
當然也可以新版VC + 動態連結系統內建crt 不過這是undocumented的作法
而且這樣做 C++的支援幾乎是殘廢(VC6等級)
或者使用上古時代的VC6或VB6(XP到win10 都有內建VB6 runtime)來寫程式
不過完全不建議 今年是2016了 1998年的工具放在歷史就好了
作者: erspicu (.)   2016-03-26 14:41:00
推認真...
作者: banana2014 (香蕉共和國)   2016-03-26 23:51:00
謝謝您,厲害!用心!

Links booklink

Contact Us: admin [ a t ] ucptt.com