Define windows version c

Windows version in c# [duplicate]

I want to know which Windows version the PC has.. in C# Framework 3.5

I have tried using

OperatingSystem os = Environment.OSVersion;

Version ver = os.Version;

But the result is

Version minor: 2

The problem is that I have «Windows 8 Pro».

How can I detect it?

4 Answers 4

You will have to match version numbers with the appropriate string value yourself.

Here is a list of the most recent Windows OS and their corresponding version number:

  • Windows Server 2016 Technical Preview — 10.0*
  • Windows 10 — 10.0*
  • Windows 8.1 — 6.3*
  • Windows Server 2012 R2 — 6.3*
  • Windows 8 — 6.2
  • Windows Server 2012 — 6.2
  • Windows 7 — 6.1
  • Windows Server 2008 R2 — 6.1
  • Windows Server 2008 — 6.0
  • Windows Vista — 6.0
  • Windows Server 2003 R2 — 5.2
  • Windows Server 2003 — 5.2
  • Windows XP 64-Bit Edition — 5.2
  • Windows XP — 5.1
  • Windows 2000 — 5.0

*For applications that have been manifested for Windows 8.1 or 10. Applications not manifested for 8.1 / 10 will return the Windows 8 OS version value (6.2).

Also, from the same source:

Identifying the current operating system is usually not the best way to determine whether a particular operating system feature is present. This is because the operating system may have had new features added in a redistributable DLL. Rather than using the Version API Helper functions to determine the operating system platform or version number, test for the presence of the feature itself.

Директивы препроцессора C# C# preprocessor directives

Хотя у компилятора нет отдельного препроцессора, директивы, описанные в этом разделе, обрабатываются так, как если бы он был. Although the compiler doesn’t have a separate preprocessor, the directives described in this section are processed as if there were one. Они используются в условной компиляции. You use them to help in conditional compilation. В отличие от директив C и C++ вы не можете использовать их для создания макросов. Unlike C and C++ directives, you can’t use these directives to create macros. Директива препроцессора должна быть единственной инструкцией в строке. A preprocessor directive must be the only instruction on a line.

Контекст, допускающий значение NULL Nullable context

Директива препроцессора #nullable устанавливает контекст с заметками о допустимости значений NULL и контекст с предупреждениями о допустимости значений NULL. The #nullable preprocessor directive sets the nullable annotation context and nullable warning context. Эта директива определяет, действуют ли заметки, допускающие значение NULL, и могут ли быть заданы предупреждения о допустимости значений NULL. This directive controls whether nullable annotations have effect, and whether nullability warnings are given. Каждый контекст либо отключен, либо включен. Each context is either disabled or enabled.

Оба контекста можно указать на уровне проекта (за пределами исходного кода C#). Both contexts can be specified at the project level (outside of C# source code). Директива #nullable управляет контекстами заметок и предупреждений и имеет приоритет над параметрами уровня проекта. The #nullable directive controls the annotation and warning contexts and takes precedence over the project-level settings. Директива задает контексты, которыми управляет, пока другая директива не переопределит ее, или до конца исходного файла. A directive sets the context(s) it controls until another directive overrides it, or until the end of the source file.

Ниже приведены результаты использования директив: The effect of the directives is as follows:

  • #nullable disable : задает контексты с заметками и предупреждениями о допустимости значения NULL в значение отключено. #nullable disable : Sets the nullable annotation and warning contexts to disabled.
  • #nullable enable : задает контексты с заметками и предупреждениями о допустимости значения NULL в значение включено. #nullable enable : Sets the nullable annotation and warning contexts to enabled.
  • #nullable restore : восстанавливает контексты с заметками и предупреждениями о допустимости значения NULL до параметров проекта. #nullable restore : Restores the nullable annotation and warning contexts to project settings.
  • #nullable disable annotations : устанавливает контекст с заметками о допустимости значения NULL в режим отключено. #nullable disable annotations : Sets the nullable annotation context to disabled.
  • #nullable enable annotations : устанавливает контекст с заметками о допустимости значения NULL в режим включено. #nullable enable annotations : Sets the nullable annotation context to enabled.
  • #nullable restore annotations : восстанавливает контексты с заметками о допустимости значения NULL до параметров проекта. #nullable restore annotations : Restores the nullable annotation context to project settings.
  • #nullable disable warnings : устанавливает контекст с предупреждениями о допустимости значения NULL в режим отключено. #nullable disable warnings : Sets the nullable warning context to disabled.
  • #nullable enable warnings : устанавливает контекст с предупреждениями о допустимости значения NULL в режим включено. #nullable enable warnings : Sets the nullable warning context to enabled.
  • #nullable restore warnings : восстанавливает контексты с предупреждениями о допустимости значения NULL до параметров проекта. #nullable restore warnings : Restores the nullable warning context to project settings.

Условная компиляция Conditional compilation

Для управления условной компиляцией используются четыре директивы препроцессора. You use four preprocessor directives to control conditional compilation:

  • #if : открывает условную компиляцию, где код компилируется, только если определен указанный символ. #if : Opens a conditional compilation, where code is compiled only if the specified symbol is defined.
  • #elif : закрывает предыдущую условную компиляцию и открывает новую на основе того, определен ли указанный символ. #elif : Closes the preceding conditional compilation and opens a new conditional compilation based on if the specified symbol is defined.
  • #else : закрывает предыдущую условную компиляцию и открывает новую, если указанный символ не определен. #else : Closes the preceding conditional compilation and opens a new conditional compilation if the previous specified symbol isn’t defined.
  • #endif : закрывает предыдущую условную компиляцию. #endif : Closes the preceding conditional compilation.

Когда компилятор C# встречает директиву #if , за которой следует директива #endif , код между этими директивами он компилирует, только когда определен указанный символ. When the C# compiler finds an #if directive, followed eventually by an #endif directive, it compiles the code between the directives only if the specified symbol is defined. В отличие от С и С++ здесь невозможно назначить символу числовое значение. Unlike C and C++, you can’t assign a numeric value to a symbol. Оператор #if в C# является логическим. Он проверяет только одно условие — определен ли указанный символ. The #if statement in C# is Boolean and only tests whether the symbol has been defined or not. Пример: For example:

Вы можете использовать операторы == (равенство) и != (неравенство) для проверки значений bool true или false . You can use the operators == (equality) and != (inequality) to test for the bool values true or false . Значение true означает, что символ определен. true means the symbol is defined. Инструкция #if DEBUG имеет то же значение, что и #if (DEBUG == true) . The statement #if DEBUG has the same meaning as #if (DEBUG == true) . Вы можете использовать операторы && (и), || (или) и ! (не), чтобы узнать, определено ли несколько символов. You can use the && (and), || (or), and ! (not) operators to evaluate whether multiple symbols have been defined. Можно также группировать символы и операторы при помощи скобок. You can also group symbols and operators with parentheses.

Читайте также:  Установка cab пакетов windows

#if , как и директивы #else , #elif , #endif , #define и #undef , позволяет включить или исключить код в зависимости от существования одного или нескольких символов. #if , along with the #else , #elif , #endif , #define , and #undef directives, lets you include or exclude code based on the existence of one or more symbols. Условная компиляция может быть полезной при компиляции кода для отладочной сборки или для определенной конфигурации. Conditional compilation can be useful when compiling code for a debug build or when compiling for a specific configuration.

Условные директивы, начинающиеся с директивы #if , должны явным образом завершаться директивой #endif . A conditional directive beginning with an #if directive must explicitly be terminated with an #endif directive. #define позволяет определить символ, #define lets you define a symbol. чтобы выражение, в качестве которого этот символ передается в директиву #if , при вычислении давало значение true . By using the symbol as the expression passed to the #if directive, the expression evaluates to true . Символ также можно определить с помощью параметра компилятора DefineConstants. You can also define a symbol with the DefineConstants compiler option. Для отмены определения символа служит директива #undef . You can undefine a symbol with #undef . Символ, создаваемый с помощью #define , будет определен в пределах того файл, в котором он определен. The scope of a symbol created with #define is the file in which it was defined. Символ, определенный с помощью DefineConstants или #define , не конфликтует с одноименной переменной. A symbol that you define with DefineConstants or with #define doesn’t conflict with a variable of the same name. Соответственно, имя переменной не должно передаваться директиве препроцессора, а символ может использоваться только в директиве препроцессора. That is, a variable name shouldn’t be passed to a preprocessor directive, and a symbol can only be evaluated by a preprocessor directive.

Директива #elif позволяет создать составную условную директиву. #elif lets you create a compound conditional directive. Выражение #elif будет вычисляться в том случае, если ни одна из предшествующих директив #if или необязательных директив #elif после вычисления выражения не возвращает значение true . The #elif expression will be evaluated if neither the preceding #if nor any preceding, optional, #elif directive expressions evaluate to true . Если после вычисления выражения #elif возвращается значение true , компилятор вычисляет весь код между директивой #elif и следующей условной директивой. If an #elif expression evaluates to true , the compiler evaluates all the code between the #elif and the next conditional directive. Пример: For example:

С помощью директивы #else можно создать составную условную директиву со следующим поведением: если ни одно из выражений в предшествующих директивах #if или (необязательно) #elif не принимает значение true , компилятор вычисляет код между директивой #else и последующей директивой #endif . #else lets you create a compound conditional directive, so that, if none of the expressions in the preceding #if or (optional) #elif directives evaluate to true , the compiler will evaluate all code between #else and the next #endif . Директива #endif обязательно указывается в качестве следующей директивы препроцессора после #else . #endif (#endif) must be the next preprocessor directive after #else .

#endif указывает на конец условной директивы, начало которой было задано с помощью директивы #if . #endif specifies the end of a conditional directive, which began with the #if directive.

Система сборки также учитывает символы препроцессора, представляющие целевые платформы в проектах в стиле SDK. The build system is also aware of predefined preprocessor symbols representing different target frameworks in SDK-style projects. Они полезны при создании приложений, предназначенных для нескольких версий .NET. They’re useful when creating applications that can target more than one .NET version.

Требуемые версии .NET Framework Target Frameworks Символы Symbols
.NET Framework .NET Framework NETFRAMEWORK , NET48 , NET472 , NET471 , NET47 , NET462 , NET461 , NET46 , NET452 , NET451 , NET45 , NET40 , NET35 , NET20 NETFRAMEWORK , NET48 , NET472 , NET471 , NET47 , NET462 , NET461 , NET46 , NET452 , NET451 , NET45 , NET40 , NET35 , NET20
.NET Standard .NET Standard NETSTANDARD , NETSTANDARD2_1 , NETSTANDARD2_0 , NETSTANDARD1_6 , NETSTANDARD1_5 , NETSTANDARD1_4 , NETSTANDARD1_3 , NETSTANDARD1_2 , NETSTANDARD1_1 , NETSTANDARD1_0 NETSTANDARD , NETSTANDARD2_1 , NETSTANDARD2_0 , NETSTANDARD1_6 , NETSTANDARD1_5 , NETSTANDARD1_4 , NETSTANDARD1_3 , NETSTANDARD1_2 , NETSTANDARD1_1 , NETSTANDARD1_0
.NET 5 (и .NET Core) .NET 5 (and .NET Core) NET , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_2 , NETCOREAPP2_1 , NETCOREAPP2_0 , NETCOREAPP1_1 , NETCOREAPP1_0 NET , NET5_0 , NETCOREAPP , NETCOREAPP3_1 , NETCOREAPP3_0 , NETCOREAPP2_2 , NETCOREAPP2_1 , NETCOREAPP2_0 , NETCOREAPP1_1 , NETCOREAPP1_0

Для традиционных проектов, в которых не используется пакет SDK, необходимо вручную настроить символы условной компиляции для различных целевых платформ в Visual Studio с помощью страниц свойств проекта. For traditional, non-SDK-style projects, you have to manually configure the conditional compilation symbols for the different target frameworks in Visual Studio via the project’s properties pages.

Другие предопределенные символы включают константы DEBUG и TRACE . Other predefined symbols include the DEBUG and TRACE constants. Вы можете переопределить значения для проектов с помощью #define . You can override the values set for the project using #define . Например, символ DEBUG автоматически устанавливается в зависимости от свойств конфигурации сборки (в режиме отладки или выпуска). The DEBUG symbol, for example, is automatically set depending on your build configuration properties («Debug» or «Release» mode).

В следующем примере показано, как определить символ MYTEST в файле и затем протестировать значения символов MYTEST и DEBUG . The following example shows you how to define a MYTEST symbol on a file and then test the values of the MYTEST and DEBUG symbols. Выходные данные этого примера зависят от режима конфигурации, в котором создан проект (Отладка или Выпуск). The output of this example depends on whether you built the project on Debug or Release configuration mode.

В следующем примере показано, как тестировать разные целевые платформы для использования более новых интерфейсов API, когда это возможно: The following example shows you how to test for different target frameworks so you can use newer APIs when possible:

Определение символов Defining symbols

Используйте следующие две директивы препроцессора, чтобы определить или отменить определение символов для условной компиляции. You use the following two preprocessor directives to define or undefine symbols for conditional compilation:

  • #define : определение символа. #define : Define a symbol.
  • #undef : отмена определения символа. #undef : undefine a symbol.

#define позволяет определить символ. You use #define to define a symbol. При использовании символа в качестве выражения, которое передается директиве #if , выражение будет иметь значение true , как показано в следующем примере: When you use the symbol as the expression that’s passed to the #if directive, the expression will evaluate to true , as the following example shows:

Директиву #define нельзя использовать для объявления значений констант, как это обычно делается в C и C++. The #define directive cannot be used to declare constant values as is typically done in C and C++. Для определения констант в C# следует использовать статические элементы класса или структуры. Constants in C# are best defined as static members of a class or struct. При наличии нескольких констант имеет смысл создать для них отдельный класс «Constants». If you have several such constants, consider creating a separate «Constants» class to hold them.

Символы можно использовать для указания условий компиляции. Symbols can be used to specify conditions for compilation. Для проверки символов можно использовать директивы #if или #elif . You can test for the symbol with either #if or #elif . Для условной компиляции также можно использовать ConditionalAttribute. You can also use the ConditionalAttribute to perform conditional compilation. Вы можете определить символ, но не можете присвоить символу значение. You can define a symbol, but you can’t assign a value to a symbol. Директива #define должна находиться в файле перед использованием любых инструкций, которые также не являются директивами препроцессора. The #define directive must appear in the file before you use any instructions that aren’t also preprocessor directives. Символ также можно определить с помощью параметра компилятора DefineConstants. You can also define a symbol with the DefineConstants compiler option. Для отмены определения символа служит директива #undef . You can undefine a symbol with #undef .

Определение областей Defining regions

Вы можете определить области кода, которые можно свернуть в структуру, используя следующие две директивы препроцессора. You can define regions of code that can be collapsed in an outline using the following two preprocessor directives:

  • #region : начало области. #region : Start a region.
  • #endregion : конец области. #endregion : End a region

Директива #region позволяет указать блок кода, который можно разворачивать и сворачивать с помощью функции структурирования в редакторе кода. #region lets you specify a block of code that you can expand or collapse when using the outlining feature of the code editor. В больших файлах кода удобно сворачивать или скрывать одну область или несколько, чтобы не отвлекаться от той части файла, над которой в настоящее время идет работа. In longer code files, it’s convenient to collapse or hide one or more regions so that you can focus on the part of the file that you’re currently working on. В следующем примере показано, как определить область: The following example shows how to define a region:

В конце блока #region должна присутствовать директива #endregion . A #region block must be terminated with an #endregion directive. Блок #region не может накладываться на блок #if . A #region block can’t overlap with an #if block. Однако блок #region можно вложить в блок #if , а блок #if — в блок #region . However, a #region block can be nested in an #if block, and an #if block can be nested in a #region block.

Сведения об ошибках и предупреждениях Error and warning information

Вы указываете компилятору создавать определенные пользователем ошибки и предупреждения компилятора, а также управлять сведениями о строках с помощью следующих директив. You instruct the compiler to generate user-defined compiler errors and warnings, and control line information using the following directives:

  • #error : создание ошибки компилятора с указанным сообщением. #error : Generate a compiler error with a specified message.
  • #warning : создание предупреждения компилятора с конкретным сообщением. #warning : Generate a compiler warning, with a specific message.
  • #line : изменение номера строки, выводимого с сообщениями компилятора. #line : Change the line number printed with compiler messages.

#error позволяет создать определяемую пользователем ошибку CS1029 из определенного места в коде. #error lets you generate a CS1029 user-defined error from a specific location in your code. Пример: For example:

Компилятор обрабатывает #error version особым образом и сообщает об ошибке компилятора CS8304 с сообщением, содержащим используемые версии компилятора и языка. The compiler treats #error version in a special way and reports a compiler error, CS8304, with a message containing the used compiler and language versions.

#warning позволяет создать предупреждение компилятора CS1030 первого уровня из определенного места в коде. #warning lets you generate a CS1030 level one compiler warning from a specific location in your code. Пример: For example:

Директива #line позволяет изменять номер строки компилятора и при необходимости имя файла, в который будут выводиться ошибки и предупреждения. #line lets you modify the compiler’s line numbering and (optionally) the file name output for errors and warnings.

В следующем примере показано, как включить в отчет два предупреждения, связанные с номерами строк. The following example shows how to report two warnings associated with line numbers. Директива #line 200 принудительно устанавливает номер следующей строки 200 (по умолчанию используется номер 6). До выполнения следующей директивы #line в отчете будет указываться имя файла Special. The #line 200 directive forces the next line’s number to be 200 (although the default is #6), and until the next #line directive, the filename will be reported as «Special». Директива #line default по умолчанию восстанавливает нумерацию строк в исходное состояние с учетом строк, номера которых были изменены с помощью предшествующей директивы. The #line default directive returns the line numbering to its default numbering, which counts the lines that were renumbered by the previous directive.

В результате компиляции формируются следующие результаты: Compilation produces the following output:

Директива #line может использоваться на автоматизированном промежуточном этапе процесса построения. The #line directive might be used in an automated, intermediate step in the build process. Например, если строки были удалены из первоначального файла с исходным кодом, но вам по-прежнему требуется создавать выходные файлы компилятора на основе изначальной нумерации строк в файле, можно удалить строки и затем смоделировать их первичную нумерацию с помощью директивы #line . For example, if lines were removed from the original source code file, but you still wanted the compiler to generate output based on the original line numbering in the file, you could remove lines and then simulate the original line numbering with #line .

Директива #line hidden скрывает последующие строки для отладчика. В этом случае при пошаговой проверке кода разработчиком все строки между #line hidden и следующей директивой #line (кроме случаев, когда это также директива #line hidden ) будут пропущены. The #line hidden directive hides the successive lines from the debugger, such that when the developer steps through the code, any lines between a #line hidden and the next #line directive (assuming that it isn’t another #line hidden directive) will be stepped over. Этот параметр также можно использовать для того, чтобы дать ASP.NET возможность различать определяемый пользователем и создаваемый компьютером код. This option can also be used to allow ASP.NET to differentiate between user-defined and machine-generated code. В основном эта функция используется в ASP.NET, но также может быть полезна и в других генераторах исходного кода. Although ASP.NET is the primary consumer of this feature, it’s likely that more source generators will make use of it.

Директива #line hidden не влияет на имена файлов и номера строк в отчетах об ошибках. A #line hidden directive doesn’t affect file names or line numbers in error reporting. Это значит, что при обнаружении ошибки в скрытом блоке компилятор укажет в отчете текущие имя файла и номер строки, где найдена ошибка. That is, if the compiler finds an error in a hidden block, the compiler will report the current file name and line number of the error.

Директива #line filename задает имя файла, которое будет отображаться в выходных данных компилятора. The #line filename directive specifies the file name you want to appear in the compiler output. По умолчанию используется фактическое имя файла с исходным кодом. By default, the actual name of the source code file is used. Имя файла должно заключаться в двойные кавычки (» «). Перед ним должен указываться номер строки. The file name must be in double quotation marks («») and must be preceded by a line number.

В следующем примере демонстрируется, как отладчик игнорирует скрытые строки кода. The following example shows how the debugger ignores the hidden lines in the code. При выполнении этого примера будут показаны три строки текста. When you run the example, it will display three lines of text. Тем не менее, если задать точку останова, как показано в этом примере, и нажать клавишу F10 для пошаговой отладки кода, отладчик игнорирует скрытую строку. However, when you set a break point, as shown in the example, and hit F10 to step through the code, the debugger ignores the hidden line. Даже если точка останова установлена на скрытой строке, отладчик по-прежнему будет игнорировать ее. Even if you set a break point at the hidden line, the debugger will still ignore it.

Директивы pragma Pragmas

Директива #pragma предоставляет компилятору специальные инструкции для компиляции файла, в котором она появляется. #pragma gives the compiler special instructions for the compilation of the file in which it appears. Компилятор должен поддерживать эти инструкции. The instructions must be supported by the compiler. Другими словами, директиву #pragma невозможно использовать для создания настраиваемых инструкций предварительной обработки. In other words, you can’t use #pragma to create custom preprocessing instructions.

  • #pragma warning : включение или отключение предупреждений. #pragma warning : Enable or disable warnings.
  • #pragma checksum : создание контрольной суммы. #pragma checksum : Generate a checksum.

pragma-name — имя распознанной прагмы, а pragma-arguments — аргументы, относящиеся к прагме. Where pragma-name is the name of a recognized pragma and pragma-arguments is the pragma-specific arguments.

#pragma warning #pragma warning

#pragma warning может включать или отключать определенные предупреждения. #pragma warning can enable or disable certain warnings.

warning-list — список номеров предупреждений с разделителем-запятой. Where warning-list is a comma-separated list of warning numbers. Префикс CS является необязательным. The «CS» prefix is optional. Если номера предупреждений не указаны, disable отключает все предупреждения, а restore включает все предупреждения. When no warning numbers are specified, disable disables all warnings and restore enables all warnings.

Чтобы найти номера предупреждений в Visual Studio, выполните сборку проекта, а затем поиск номеров предупреждений в окне Вывод. To find warning numbers in Visual Studio, build your project and then look for the warning numbers in the Output window.

Параметр disable вступает в силу, начиная со следующей строки исходного файла. The disable takes effect beginning on the next line of the source file. Предупреждение восстанавливается в строке после restore . The warning is restored on the line following the restore . Если в файле нет restore , предупреждения восстанавливаются до их состояния по умолчанию в первой строке всех последующих файлов в той же компиляции. If there’s no restore in the file, the warnings are restored to their default state at the first line of any later files in the same compilation.

#pragma checksum #pragma checksum

Создает контрольные суммы для исходных файлов, чтобы помочь с отладкой страниц ASP.NET. Generates checksums for source files to aid with debugging ASP.NET pages.

«filename» — это имя файла, для которого требуется наблюдение за изменениями или обновлениями, «» — глобальный уникальный идентификатор (GUID) для хэш-алгоритма, а «checksum_bytes» — строка шестнадцатеричных цифр, представляющих байты контрольной суммы. Where «filename» is the name of the file that requires monitoring for changes or updates, «» is the Globally Unique Identifier (GUID) for the hash algorithm, and «checksum_bytes» is the string of hexadecimal digits representing the bytes of the checksum. Должно быть четным числом шестнадцатеричных цифр. Must be an even number of hexadecimal digits. Нечетное число цифр приведет к выводу предупреждения во время компиляции, и директива будет пропущена. An odd number of digits results in a compile-time warning, and the directive is ignored.

Отладчик Visual Studio использует контрольную сумму, чтобы подтвердить нахождение правильного источника. The Visual Studio debugger uses a checksum to make sure that it always finds the right source. Компилятор вычисляет контрольную сумму для исходного файла, а затем передает результат в файл базы данных (PDB) программы. The compiler computes the checksum for a source file, and then emits the output to the program database (PDB) file. Отладчик затем использует PDB-файл для сравнения с контрольной суммой, вычисленной им для исходного файла. The debugger then uses the PDB to compare against the checksum that it computes for the source file.

Это решение не работает для проектов ASP.NET, так как рассчитанная контрольная сумма относится к созданному исходному файлу, а не файлу ASPX. This solution doesn’t work for ASP.NET projects, because the computed checksum is for the generated source file, rather than the .aspx file. Чтобы решить эту проблему, #pragma checksum предоставляет поддержку контрольных сумм для страниц ASP.NET. To address this problem, #pragma checksum provides checksum support for ASP.NET pages.

При создании проекта ASP.NET в Visual C# созданный исходный файл содержит контрольную сумму для ASPX-файла, из которого создается источник. When you create an ASP.NET project in Visual C#, the generated source file contains a checksum for the .aspx file, from which the source is generated. Затем компилятор записывает эти данные в PDB-файл. The compiler then writes this information into the PDB file.

Если компилятор не обнаруживает директиву #pragma checksum в файле, он вычисляет контрольную сумму и записывает значение в PDB-файл. If the compiler doesn’t find a #pragma checksum directive in the file, it computes the checksum and writes the value to the PDB file.

Читайте также:  Формат rar windows 10
Оцените статью