Большой исходный файл C # с сигнатурами, структурами, константами методов Windows API: все ли они будут включены в окончательный .exe? - PullRequest
8 голосов
/ 30 ноября 2010

Я хочу поместить все сигнатуры функций API Windows, которые я использую в программах, в один класс, такой как WinAPI, и в файл WinAPI.cs, который я включу в свои проекты.Класс будет внутренняя статическая , а методы открытая статическая extern .(Что-то вроде огромного NativeMethods.cs из исходного кода .NET Framework).

Допустим, WinAPI.cs имеет сто сигнатур собственных методов, таких как:

[DllImport("user32.dll")]
internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  1. Если я собираюсь использовать только несколько из них в проекте (даже один или два), если я включу файл WinAPI.cs в свой проект, будет ли окончательный .exe заполнен ненужными объявлениями методов, которые яне используется (остальные 99 или около того)?

  2. Как насчет объявлений собственных структур, если я не буду использовать их в текущем проекте, будут ли они по-прежнему включены в окончательный .exe?

        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
        }
    
  3. А как насчет объявлений констант или членов только для чтения, таких как:

    public const int WH_JOURNALPLAYBACK = 1;
    public static readonly int WM_GETTEXT = 0x0D;
    

Ответы [ 4 ]

4 голосов
/ 30 ноября 2010

Не парься здесь.Это просто декларации, для них в финальной сборке нет ИЛ.Они просто занимают место в метаданных.Шансы очень высоки, что они даже не загружаются из сборки, особенно когда вы держите объявления вместе.Метаданные загружаются в ОЗУ только при использовании, по 4096 байт за раз.

Кстати, вы явно не хотите использовать readonly для этих объявлений констант.Теперь вы делаете , чтобы они заняли место, даже если они не используются.Один из немногих случаев, когда публичный const является хорошей идеей.Это явные константы, их значение никогда не меняется.Как Math.PI.

2 голосов
/ 30 ноября 2010

Все указанные вами элементы будут включены в окончательную сборку.Единственный способ избавиться от них из окончательного exe-файла - это использование директив прекомпиляции.Например:

#if EXCLUDE_METHODS

// здесь не используются методы

#endif
2 голосов
/ 30 ноября 2010

Все из этого будут включены. Тем не менее, он будет включен как IL, и когда программа запускается, это просто скомпилированный машинный код. Мы говорим, может быть, не более 40 тысяч места.

1 голос
/ 30 ноября 2010

Если я собираюсь использовать только некоторые из них в проекте (даже один или два), если я включить файл WinAPI.cs в мой проект, будет ли заполнен финальный .exe с ненужным методом декларации я не использую (другой 99 или около того)?

Да, весь код вашего проекта будет скомпилирован в вашу сборку;

А как насчет нативной структуры декларации, если я не использую их в текущий проект, будут ли они еще быть включенным в финал .exe?

Да. Они тоже будут включены.

   What about constants declarations or readonly members like:

Да. Они тоже будут включены.

...