学习Winform这么久了,还没想过一个程序是如何被载入的,甚至连里面变量如何初始化,都没有仔细的考虑过,今天抽了点时间验证了一下自己突然然到的东西,首先说一点基础的东西,一个类在被载入时(首次用一个类时),会先被始化静态成员变量,然后是静态构造函数,然后才是自己的操作.既然是这样,那可以想一下,在C#中Main函数不也是在一个类中的吗,那样也就会先初始化静态成员的,所以只要一点的代码就可以实现其它的函数作为入口:
下面分别用C#写一下,
在Program.cs文件中测试代码如下
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsApplication2
{
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main()
{
MessageBox.Show("Main函数终于执行了");
}
//先初始化静态成员,就可以调用其它函数了,然后才是Main函数
static int i = Main2();
static int Main2()
{
Application.Run(new Form());
return 1;
}
}
}
当然这样做也没什么好处,但是知道也没什么坏处,对程序运行顺序多一点点的了解而已
既然C#是这样,那C++也行了,尽管C++入口不在一个类中
下面写C++的
[STAThreadAttribute]
int main(array
{
System::Windows::Forms::MessageBox::Show("这里是Main,但是不是从这里开始");
return 0;
}
static int main2()
{
System::Windows::Forms::MessageBox::Show("这里不是Main,是Main2,但是从这里开始");
return 0;
}
static int i=main2();
他们之间有一点是不一样的
C#里的Main一定要在一个类当中,C++的刚好相反,这一点我就不知道了.
可以看下资料:
系统并不是直接调用Main函数,而是去调用C/C++运行期启动函数,此函数会初始化C/C++运行库,因此,在程序中可以调用malloc,free之类函数,它也会保证在用户的代码之前把所有的全局或静态对像的创建.
当然如果不初始化,直接进入Main函数,如果Main中用到了静态成员,那不就错了,所以这样才能解决
当然也可以加点代码证明一下winform进程是在什么时候产生的.