要重现这个问题的代码很简单:
class Program
    {
        private static ClassA a = new ClassA();        static void Main(string[] args)
        {
            Console.ReadLine();
        }
    }    class ClassA
    {
        static ClassA()
        {
            Console.WriteLine("A cctor");
        }
    }只要访问ClassA,它的静态构造方法就会执行。
所以程序一运行就应该输出“A cctor”。
实际上如果target framework设为.net 2.0或者3.5的话输出结果都是“A cctor”。
但是如果target framework是.net 4而且用release编译的话,编译出的程序集脱离IDE运行(在VS里运行结果还是对的)时则没有输出任何东西。太奇怪了,哪位知道如何解决请帮忙,谢谢。

解决方案 »

  1.   

    静态构造方法的作用就是为了给一些静态变量赋初始值的所以:
    private static ClassA a = new ClassA();肯定会执行它的静态构造方法,但是静态构造方法只会被执行一次
      

  2.   


    我也是这么想的啊。
    但是target framework设为.net 4,用release编译,并且在IDE之外运行的时候就没有执行。
      

  3.   

    总结:http://www.cnblogs.com/cuipengfei/archive/2010/08/01/1790091.html
      

  4.   

    如果我的程序员写这种代码        static void Main(string[] args)
            {
                Console.ReadLine();
            }那么我直接删除这种成事不足的代码就完了,何必管它呢?
      

  5.   

    那一句“Console.WriteLine”之所以不被注意,是因为那样写对于实际产品没有什么意义。当然,对于微软可能有点意义。
      

  6.   

    我帖子里面写的只是个重现问题的例子。
    swig在给非托管类库生成托管的包装时会依赖于静态字段初始化的时机,我在用它的时候遇到了问题,所以才有这么一问。
    我在这儿:http://www.cnblogs.com/cuipengfei/archive/2010/08/01/1790091.html把问题记下来了。
      

  7.   

    在编译器检查到从来不使用的 private static 对象,是否必须写在类的 cctor 过程中,我没有见过这个规范!过去我们都是根据编译器编译出来的结果来解释,来说明它被编译到cctor的第一行那个地方,但是这毕竟不是规范,而是我们自己去解释。
      

  8.   


    因为没有规范,所以对问题的分类上,只能判断为“新特性”,而不是一个Reopen的bug。这就是内部的问题处理流程。
      

  9.   

    也是在用GDAL的时候遇到的这个问题吗?