vs2012编写的c#窗体程序在xp上跑不了,怎么办

vs2012编写的c#窗体程序在xp上跑不了,怎么办,第1张

微软为了推销自家平台,默认配置下VS2012和VS2013编写的应用程序只能在Vista/Win7/Win8上运行。但幸好还保留了生成XP程序的设置项。XP和Win2003的用户还是大量存在的,我们程序软件的发布不能不考虑他们。

1

项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”;

2 项目菜单->项目属性->配置属性->常规->MFC的使用,选择在静态库中使用MFC;

3

项目菜单->项目属性->链接器->系统->子系统->控制台或窗口windows(根据你的项目类型选择),第二项版本号设成501。

4 C/C++->代码生成->运行库,选择“多线程调试(/MTd)";

5 还需要至少带有Update3(或4),这一点我没有验证,因为我直接安装的就是带有Update3的VS2013。

以上就OK了。缺点仍然有,例如静态编译的EXE比正常动态要大不少,目前我尚未试出动态编译后在XP中能运行的方法,--不过这个不要紧,因为VS2013版本如此之高,客户的电脑上很难自带配有它的运行库,你即使动态编译,发布软件时也还是要带上运行库的,只不过在多个程序时只需带一份运行库罢了。

另外,我在实际大项目中用上述方法,仍有出错现象发生。以后再研究吧。一般情况下上述方法就可以了。

在网上另外发现了这个贴子,说得很详细,包括非IDE的命令行编译,一起贴到下面:

问题一:编译出来的exe在xp上面运行提示“不是有效的win32应用程序”

在vs2012/2013版本里面,其自带的c编译器clexe,若直接使用cl

ac编译,那么生成出来的exe放在vista及以上版本直接运行没有问题,但是在xp上则会出来“不是有效的win32应用程序”的出错提示。这是因为vs2012/2013自带的c编译器默认情况下生成的exe会默认只支持vista及以上版本的windows系统。

解决方法:

对于使用命令行clexe直接编译的方式:

先用cl ac编译一遍,此时会生成aexe和aobj两个文件,此时,再执行 link bobj

/subsystem:console,501,它会链接一个新的aexe出来,此时的exe就可以在xp上运行了。相比vs2010以及以前版本的编译器编译,会多第二步的link过程,后面的参数也很容易理解,subsystem,501,此处的501是指的windows内核版本号,501表示windows

2000 with sp1,即此exe可以在win2000 sp1及以上的windows中执行。

当然,这个地方的/subsystem后面有很多参数,上面给的console,501是指命令行程序,如果是有GUI即有窗口的程序,改成windows,501即可。!!注意!!此处的501一定不要想当然改成50就变成windows

2000

不带sp1的版本,实际上,50并不被vs2013的编译所承认,会报警告不认50,就会按照默认的不带501的方式编译,这样就无法在vista以下的系统中运行生成的exe了。

对于在vs2013里面使用新建项目的方式:

右击相应的项目,选择“属性”,在项目属性页中的“配置属性”下面的“常规”里面,把“平台工具集”,由“Visual Studio 2013

(v120)”改成“Visual Studio 2013 - Windows XP

(v120_xp)”,确定之后,重新生成项目即可。当然这里按这样修改的话,就只能在winxp及以上的版本系统里面运行了。

问题二:用vs2010/2012/2013编译出来的exe在未安装vc++运行库的机器上运行时提示”未找到MSVCR120DDLL“从而无法运行

这是个老问题了,无非就是运行库动态编译和静态编译的问题了。dll动态加载的话有个好处,它可以减少生成的exe文件的体积,但是缺点就是如果对应的系统环境变量或者exe所在的目录里面找不到其所需要的dll文件的话,程序就会拒绝执行。而静态编译就是把所有需要的库都静态编译到exe文件里面,这样就可以在所有的系统平台上都能运行,但它也有一个缺点,就是生成的exe文件因为已经带了部分库的代码,所以体积会相对动态编译出来的exe大(具体大多少要根据库的内容才能确定)。

解决方法:

对于直接使用clexe和linkexe编译连接的方式:

直接在clexe编译的时候或者在makefile里面把编译参数加上/MT即可。

对于在vs2013里面使用新建项目的方式:

右击相应的项目,选择“属性”,在项目属性页中的“配置属性”下面的“C/C++”下面的“代码生成”一项,由默认的“多线程调试DLL

(/MDd)”,改成“多线程 (/MT)”,确定之后,重新生成项目即可。这样所得的exe文件就是静态编译了。

电脑退出当前程序快捷键是「Alt」+「F4」,或者鼠标点击软件右上角的「X」按钮,还可以对着屏幕下方的程序图标「右键」打开-「关闭窗口」来实现退出程序。对于卡死状态无法关闭的程序,可以打开任务管理器(菜单快捷键:Ctrl+Alt+Delete),选中应用程序的名称,点击结束任务。

电脑退出程序的按键有:

1、Alt+F4 关闭当前程序。

2、Alt+空格+C 关闭窗口。

3、Alt+空格+N 最小化当前窗口。

4、Alt+空格+R 恢复最小化窗口。

5、Alt+空格+X 最大化当前窗口。

Visual Basic 应用程序的结构

一个应用程序实际上无非是指挥计算机完成任务的指令集。应用程序的结构是组织指令的方法,也就是指令存放的位置和指令的执行顺序。

典型的 "hello world" 例子以及诸如此类的简单应用程序都具有简单结构。对于只有一行的代码来说,组织结构并不十分重要。但应用程序越复杂,对组织或结构的要求也就越明显。试想一下,如果允许应用程序以随机顺序去执行,那将会带来什么样的混乱。除了对应用程序的执行进行控制外,如何在应用程序中轻松查找特定指令,结构也起着很重要的作用。

由于 Visual Basic 应用程序是基于对象的,所以应用程序的代码结构就是该程序在屏幕上物理表示的模型。根据定义,对象包含数据和代码。在屏幕上看到的窗体代表属性,这些属性定义了窗体的外观和内在特性。应用程序中的每个窗体都有一个包含其代码的相关的窗体模块(文件扩展名为 frm)。

每个窗体模块都包含事件过程,即代码部分,其中有为响应特定事件而执行的指令。窗体可包含控件。在窗体模块中,对窗体上的每个控件都有一个对应的事件过程集。除了事件过程,窗体模块还可包含通用过程,它对来自任何事件过程的调用都作出响应。

可将那些与特定窗体或控件无关的代码放入另一类型的模块——标准模块(文件扩展名为 BAS )中。一个过程可能用来响应几个不同对象中的事件,应该将这个过程放在标准模块中,而不应在每一个对象的事件过程中重复相同的代码。

用类模块(文件扩展名为 CLS )创建对象,这些对象可被应用程序内的过程调用。标准模块只包含代码,而类模块既包含代码又包含数据,可视为没有物理表示的控件。

在第四章“工程的管理”中叙述了哪些部件可以添加到应用程序中,本章将说明如何将代码写到构成应用程序的各种部件中。按照缺省规定,工程包含的窗体模块。可根据需要另行添加窗体、类和标准模块。第九章“用对象编程”将讨论类模块。

事件驱动应用程序的工作方式

事件是窗体或控件识别的动作。在响应事件时,事件驱动应用程序执行 Basic代码。Visual Basic 的每一个窗体和控件都有一个预定义的事件集。如果其中有一个事件发生,而且,在关联的事件过程中存在代码,则 Visual Basic 调用该代码。

尽管 Visual Basic 中的对象自动识别预定义的事件集,但要判定它们是否响应具体事件以及如何响应具体事件则是编程的责任了。代码部分(即事件过程)与每个事件对应。 想让控件响应事件时,就把代码写入这个事件的事件过程之中。

对象所识别的事件类型多种多样,但多数类型为大多数控件所共有。例如,大多数对象都能识别 Click 事件——如果单击窗体,则执行窗体的单击事件过程中的代码;如果单击命令按钮,则执行命令按钮的Click 事件过程中的代码。每个情况中的实际代码几乎完全不一样。

这里是事件驱动应用程序中的典型事件序列:

1 启动应用程序,装载和显示窗体。

2 窗体(或窗体上的控件)接收事件。事件可由用户引发(例如键盘 *** 作),可由系统引发(例如定时器事件),也可由代码间接引发(例如,当代码装载窗体时的 Load 事件)。

3 如果在相应的事件过程中存在代码,就执行代码。

4 应用程序等待下一次事件。

注意 许多事件伴随其它事件发生。例如,在 DblClick 事件发生时,MouseDown、MouseUp 和 Click 事件也会发生。

一:NET中窗体应用程序就是一种GUI程序

窗体创建的两种方式:

(1)自动生成的是:

[csharp] view plain copy print

ApplicationRun(new Form1());

相当于:

[csharp] view plain copy print

Form1 f = new Form1();

ApplicationRun(f);

(2)显示新的窗体

[csharp] view plain copy print

Form2 f = new Form2( );

fShow();

二;事件

Windows 系统中处处是事件:

鼠标按下

鼠标释放

键盘键按下……

Windows 通过随时响应用户触发的事件做出相应的响应——事件驱动机制

WinForms 应用程序也是事件驱动的

开发人员针对感兴趣的事件,编写相应的事件处理程序

编写事件处理程序::::

1、选中控件

2、在“属性”窗口中单击“闪电”图标

3、找到要处理的事件

4、生成事件处理方法

5、编写处理代码

例:随鼠标移动,显示鼠标当前坐标

点击选中窗体

属性窗体中找到MouseMove事件

双击事件生成事件处理程序框架

编写代码

[csharp] view plain copy print

private void Form1_MouseMove(object sender, MouseEventArgs e)

{

thisText = stringFormat("鼠标位置({0},{1})", eX, eY);

}

运行图;

常用窗体事件

Load :窗体加载事件(即将显示尚未显示),常用作初始化功能

Click事件:鼠标单击事件

DoubleClick事件:鼠标双击事件

MouseMove :鼠标移动事件

KeyDown :键盘按下事件

KeyUp :键盘释放事件

小例子:单击窗体计1分,双击窗体计10分,编写程序,随时显示得分总数。

定义变量n存储分数,初值为0

单击事件click中n+1,并刷新

双击事件DoubleClick中n+10,并刷新

在窗体上设置单击

[csharp] view plain copy print

private void Form1_MouseClick(object sender, MouseEventArgs e)

{

n += 1;

string s = stringFormat("得分{0}", n);

thisText = s;

}

运行如下:

双击如下;

[csharp] view plain copy print

private void Form1_MouseDoubleClick(object sender, MouseEventArgs e)

{

n += 10;

string s = stringFormat("得分{0}", n);

thisText = s;

}

运行图;

这个还有点缺陷,双击本该是23,但却成啦24,双击时记上的单击的那下

(2)菜单控件

创建菜单的步骤:

1、切换设计器

2、工具箱→所有 Windows 窗体

3、向窗体添加 MenuStrip 控件

4、设置菜单的属性和事件

设计学生管理菜单,注意菜单分隔条的设计

实现“退出”功能

关闭窗体,调用窗体类的Close方法

关闭当前窗体 thisClose( );

[csharp] view plain copy print

private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)

{

thisClose();

}

以上就是关于vs2012编写的c#窗体程序在xp上跑不了,怎么办全部的内容,包括:vs2012编写的c#窗体程序在xp上跑不了,怎么办、电脑退出程序按哪个键、VisualBasic编程基础--应用程序的结构等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9810122.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存