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