Как найти все статические конструкторы?

У меня есть большое решение Visual Studio многих проектов С#. Как найти все статические конструкторы? У нас было несколько ошибок, в которых некоторые делали глупые вещи, я хочу проверить других.

Ответы

Ответ 1

В Visual Studio вы можете искать в коде, используя регулярное выражение.

Попробуйте следующее:

static\s+\w+\s*\(

search box

Вы можете настроить набор символов, если вы позволите своим разработчикам использовать другие чем буквы, цифры и подчеркивание. Упрощенное регулярное выражение с использованием \w

Это работает, потому что для другого использования ключевого слова static требуется, по крайней мере, тип возврата.

Ответ 2

Я думаю, что использование рефлексии - это самый быстрый способ ее достижения. Вы можете добавить новый проект в решение и написать небольшой фрагмент кода (возможно, сохранить имена конструктора в текстовый файл):

public static IEnumerable<ConstructorInfo> GetAllStaticConstructorsInSolution()
{
   var assemblies = AppDomain.CurrentDomain.GetAssemblies();

   return assemblies.SelectMany(assembly => assembly.DefinedTypes
                   .Where(type => type.DeclaredConstructors.Any(constructorInfo => constructorInfo.IsStatic))
                   .SelectMany(x => x.GetConstructors(BindingFlags.Static)))
                   .Distinct();
}

Выше запрос Linq должен работать, хотя я его не тестировал.

Ответ 3

Вы можете попытаться использовать отражение над встроенными сборками, а не искать исходный код: http://msdn.microsoft.com/en-us/library/h70wxday(v=vs.110).aspx Это может быть быстрее/проще, чем grepping текст.

Вы также можете посмотреть такие инструменты, как NDepend: http://www.ndepend.com/ Это позволит вам писать запросы linq по коду. Это не дешево, однако.

Ответ 4

Вы можете использовать ildasm и сбросить сборку, а затем выполнить поиск файла .il для .cctor (не .ctor, используйте дополнительный c). Статические конструкторы реализуются с помощью методов .cctor.

ildasm program.exe /out=program.il

Пример:

.method private hidebysig specialname rtspecialname static
        void  .cctor() cil managed
{
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Static constructor"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Animal::.cctor