【发布时间】:2010-08-26 22:50:39
【问题描述】:
我在调试模式下的预期输出和输出,以及在 VS2010、.NET 4.0 下的发布模式:
bar construct
main
在发布模式下输出不是在VS2010调试器下,在WinDbg下:
main
程序在 VS2005、.NET 2.0 上没有表现出这种行为
using System;
namespace static_init
{
public class bar
{
public bar()
{
Console.WriteLine("bar construct");
}
}
class Program
{
public static bar blah = new bar();
static void Main(string[] args)
{
Console.WriteLine("main");
Console.ReadLine();
}
}
}
可能相关: Static constructor can run after the non-static constructor. Is this a compiler bug?
更新
在我的实际代码构造函数中,bar() 使用 C++(非托管)初始化了一些互操作代码。它需要在这个库中的任何其他内容之前发生 - 有什么方法可以确保无需在库中放入涉及所有静态(具有未外部引用的副作用)的 init() 函数?
未来搜索者的注意事项:我使用的是 SWIG,这是他们在包装器生成代码中做出的假设。 SWIGStringHelper 是当前的罪犯,但可能还有更多。
结论
更新到 SWIG 的 2.0 版,它根据新版本 .NET 的需要放入静态构造函数。
【问题讨论】:
-
非常感谢“更新”和“结论”——我有非常相似的场景,也使用了旧的 SWIG 1.3.40——刚刚更新到 2.0.9,一切正常。 “结论”为我节省了大量的调查时间!