Ожидаемый вывод и вывод я получаю в режиме отладки и в режиме выпуска под 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();
}
}
}
Вероятно, связано:
Статический конструктор может запускаться после нестатического конструктора. Это ошибка компилятора?
Обновление
В моем фактическом конструкторе кода bar()
инициализирует некоторый код взаимодействия с C ++ (неуправляемый). Это должно произойти раньше, чем что-либо еще в этой библиотеке - есть ли способ убедиться, что без добавления в библиотеку функции init()
, которая затрагивает всю статику (с побочными эффектами, на которые нет внешних ссылок) в библиотеке?
Примечание для будущих поисковиков: я использую SWIG, и это предположение, которое они сделали в своем коде генерации оболочки. SWIGStringHelper
текущий нарушитель, хотя может быть и больше.
Заключение
Обновление SWIG до версии 2.0; в него добавляется статический конструктор, необходимый для более новой версии .NET.