×
=0) { let js = text.slice(pos1, pos2); + '<\/' + "script" + '>'; arrText.push(js); // next pos1 = pos2; continue; } } } break; } return arrText; } function OpenDialog(parentDiv, urlContent) { parentDiv = document.getElementById('modal-background'); // new !!!!!!! parentDiv.appendChild(document.getElementById('modal-template')); document.getElementById('modal-background').style.display = "block"; document.getElementById('modal-template').style.display = "flex"; // !!!!! document.getElementById('modal-body').innerHTML = ""; post_url(urlContent, "", function(text_from_server) { var element = document.getElementById('modal-body'); element.innerHTML = text_from_server; // add scripts var arrJSText = get_scripts(text_from_server); for (var i=0; i
dir.by
Праздники ...
Праздники ...
День Святого Валентина (14 Февраля)
Концерты, выставки, цирки ...
Концерты, выставки, цирки ...
Музыка шоу при свечах "Music of Ludovico Einaudi" г. Минск 30 января, 14 февраля, 28 марта, 25 апреля 2026
Афишу
Спорт занятия ...
Спорт занятия ...
Играем в баскетбол, футбол, волейбол
Спорт занятие
Компьютеры, игры, программирование
Компьютеры, игры, программирование
Объявления ...
Объявления ...
Купить ЭлектроСамокаты на kupisamokat.by + Подарок
Объявление
Форум (ваши вопросы, обсуждение)
Форум (ваши вопросы, обсуждение)
Поиск
Программирование, разработка, тестирование
→
C# (язык программирования)
→
В приложении C# вызываем функции из Windows dll (C++ WinAPI). Атрибут [DllImport("user32.dll")]
Посмотрели
27827
раз(а)
Комментариев
1
Последний комментарий
:
(12 октября 2021 20:01) Какая же тут годная информация. Без воды и пр...
читать...
написать комментарий...
В приложении C# вызываем функции из Windows dll (C++ WinAPI). Атрибут [DllImport("user32.dll")]
последнее обновление: 21 июня 2023
CLR
(
Common Language Runtime
) это общая среда выполнения языков.
Программный код, который выполняется под управлением
CLR
, называется управляемым кодом
(managed code)
.
Программный код, выполняющийся вне среды выполнения
CLR
, называется неуправляемым кодом
(unmanaged code)
.
Примером неуправляемого программного кода служат функции
Win32 API
, компоненты
COM
, интерфейсы
ActiveX
.
Несмотря на большое количество классов
.NET Framework
, содержащих множество методов, программисту все равно приходится иногда прибегать к неуправляемому коду.
Надо сказать, что число вызовов неуправляемого кода уменьшается с выходом каждой новой версии
.NET Framework
.
Microsoft
надеется, что наступит такое время, когда весь код можно будет сделать управляемым и безопасным. Но пока реальность такова, что без вызовов функций
Windows API
нам пока не обойтись.
Пример
(вызываем функцию Windows WinAPI)
C#
Создаем новое C# консольное приложение ...
и напишем код
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
// подключаем атрибут DllImport
using
System.Runtime.InteropServices;
namespace
ConsoleApplication1
{
class
Program
{
// Импортируем библиотку
user32.dll
(содержит
WinAPI
функцию
MessageBox
)
[
DllImport
(
"user32.dll"
)]
public
static
extern
int
MessageBox(IntPtr hWnd, String text, String caption,
int
options);
// объявляем метод на
C#
static
void
Main(
string
[] args)
{
// Вызываем
MessageBox
(вызовется функция
Windows WinAPI
)
MessageBox(IntPtr.Zero,
"Hello!"
,
"My Message"
, 0);
}
}
}
Результат примера
Описание
Управляемый код
.NET Framework
может вызывать неуправляемую функцию из файла
dll
(функцию
Windows API
) при помощи специального механизма
Platform Invoke
(сокр.
P/Invoke
).
Для того чтобы обратиться к какой-нибудь неуправляемой библиотеке
DLL
, вы должны преобразовать
.NET
-объекты в наборы
struct
,
char*
и указателей на функции, как того требует язык
C
.
Как сказали бы программисты на своем жаргоне — вам нужно маршалировать параметры.
О C# маршалинге можно почитать в документации ...
Чтобы вызвать
DLL-
функцию из
C#
, сначала ее необходимо объявить.
Для этого используется атрибут
DllImport
Иногда в примерах вы можете также встретить такой способ (длинный и неудобный):
[System.Runtime.InteropServices.DllImport("User32.Dll")]
это на любителя.
Атрибут
DllImport
сообщает компилятору, где находится точка входа, что позволяет далее вызывать функцию из нужного места.
Вы должны всегда использовать тип
IntPtr
для
HWND
,
HMENU
и любых других описателей.
Для
LPCTSTR
используйте
String
, а сервисы взаимодействия (
interop services
) выполнят автоматический маршаллинг
System.String
в
LPCTSTR
до передачи в
Windows
. Компилятор ищет указанную выше функцию
SetWindowText
в файле
User32.dll
и перед ее вызовом автоматически преобразует вашу строку в
LPTSTR (TCHAR*)
.
Для каждого типа в
C#
определен свой тип, используемый при маршалинге по умолчанию
(default marshaling type)
. Для строк это
LPTSTR
.
C#
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Text;
using
System.Threading.Tasks;
// подключаем атрибут
DllImport
using
System.Runtime.InteropServices;
namespace
ConsoleApplication1
{
class
Program
{
// Импортируем библиотку
user32.dll
(содержит
WinAPI
функцию
MessageBox
)
[
DllImport
(
"user32.dll"
)]
public
static
extern
void
SetWindowText(IntPtr hwnd, String lpString);
static
void
Main(
string
[] args)
{
// Вызываем
MessageBox
(вызовется функция
Windows WinAPI
)
SetWindowText(IntPtr.Zero,
"Hello!"
);
}
}
}
Вызов функций Windows API, имеющих выходной строковый параметр char*
Предположим, нам необходимо вызвать функцию
GetWindowText
, у которой имеется строковый выходной параметр char*. По умолчанию, для строк используется
LPTSTR
, но если мы будем использовать
System.String
, как было сказано выше, то ничего не произойдет, так как класс
System.String
не позволяет модифицировать строку. Вам необходимо использовать класс
StringBuilder
, который позволяет изменять строки.
C#
// для
StringBuilder
using
System.Text;
[
DllImport
(
"user32.dll"
)]
public
static
extern
int
GetWindowText(IntPtr hwnd, StringBuilder buf,
int
nMaxCount);
Тип, используемый для маршашлинга
StringBuilder
по умолчанию, — тоже
LPTSTR
, зато теперь
GetWindowText
может модифицировать саму вашу строку:
C#
StringBuilder sTitleBar =
new
StringBuilder(255);
GetWindowText(this.Handle, sTitleBar, sTitleBar.Capacity);
MessageBox.Show(sTitleBar.ToString());
Таким образом, ответом на вопрос, как вызывать функцию, у которой есть выходной строковый параметр, будет — используйте класс
StringBuilder
.
Изменение типа, применяемого для маршалинга по умолчанию
Например, мы хотим вызвать функцию
GetClassName
, который принимает параметр
LPSTR (char*)
даже в
Unicode-версиях.
Если вы передадите строку, общеязыковая исполняющая среда (
CLR
) преобразует ее в серию
TCHAR
. Но с помощью атрибута
MarshalAs
можно переопределить то, что предлагается по умолчанию:
C#
[
DllImport
(
"user32.dll"
)]
public
static
extern
int
GetClassName(IntPtr hwnd, [MarshalAs(UnmanagedType.LPStr)] StringBuilder buf,
int
nMaxCount);
Теперь, когда вы вызовете
GetClassName
,
.NET
передаст вашу строку в виде символов
ANSI
, а не "широких символов".
Вызов функций, требующих struct
Возьмем для примера функцию
GetWindowRect
, которая записывает в структуру
RECT
экранные координаты окна. Чтобы вызвать функцию
GetWindowRect
и передать ей структуру
RECT
нужно использовать тип
struct
в сочетании с атрибутом
StructLayout
C#
[StructLayout(LayoutKind.Sequential)]
public
struct
RECT
{
public
int
left;
public
int
top;
public
int
right;
public
int
bottom;
}
[
DllImport
(
"user32.dll"
)]
public
static
extern
int
GetWindowRect(IntPtr hwnd, ref RECT rc);
Важно использовать
C# ref
, чтобы
CLR
передала параметр типа
RECT
как ссылку. В этом случае функция сможет модифицировать ваш объект, а не его безымянную копию в стеке.
После такого объявления функции можно ее вызвать в коде:
C#
int
w, h;
RECT rc =
new
RECT();
GetWindowRect
(this.Handle, ref rc);
w = rc.right - rc.left;
h = rc.bottom - rc.top;
MessageBox.Show(
"Ширина формы: "
+ w +
"\n\rВысота формы: "
+ h);
Обратите внимание, что
ref
используется и в объявлении, и при вызове функции. Тип, по умолчанию применяемый для маршалинга типов
struct
— по умолчанию
LPStruct
, поэтому необходимости в атрибуте
MarshalAs
нет. Но если вы хотите использовать
RECT
в виде класса, а не
struct
, вам необходимо реализовать оболочку:
C#
// Если
RECT
- класс, а не структура (
struct
)
[
DllImport
(
"user32.dll"
)]
public
static
extern
int
GetWindowRect
(IntPtr hwnd, [MarshalAs(UnmanagedType.LPStruct)] RECT rc);
Работа с функциями обратного вызова в C#
Для использования функций, написанных на
C#
, в качестве функций обратного вызова
Windows
, нужно использовать:
delegate
C#
delegate
bool
EnumWindowsCB(
int
hwnd,
int
lparam);
Объявив свой тип делегата, можно написать оболочку для функции
Windows API
:
C#
[
DllImport
(
"user32"
)]
public
static
extern
int
EnumWindows
(EnumWindowsCB cb,
int
lparam);
Так как в строке с
delegate
просто объявляется тип делегата
(delegate type)
, сам делегат нужно предоставить в классе:
C#
public
static
bool
MyEWP(
int
hwnd,
int
lparam)
{
// Делаем тут что-нибудь
return
true;
}
а затем передаем:
C#
EnumWindowsCB cb =
new
EnumWindowsCB(MyEWP);
Win32.EnumWindows(cb, 0);
Проницательные читатели заметят, что я умолчал о проблеме с
lparam
.
В языке
C++
, если в
EnumWindows
дается
LPARAM
,
Windows
будет уведомлять вашу функцию обратного вызова этим
LPARAM
. Обычно
lparam
— указатель на некую структуру или класс, который содержит контекстную информацию, нужную вам для выполнения своих операций.
Но запомните:
В
.NET
слово
pointer
произносить нельзя! Так что же делать? Можно объявить ваш
lparam
как
IntPtr
и использовать
GCHandle
в качестве его оболочки:
C#
//
lparam
— это тип
IntPtr
delegate
bool
EnumWindowsCB(
int
hwnd, IntPtr lparam);
// Помещаем объект в оболочку
GCHandle
MyClass obj =
new
MyClass();
GCHandle gch = GCHandle.Alloc(obj);
EnumWindowsCB cb =
new
EnumWindowsCB(MyEWP);
Win32.EnumWindows(cb, (IntPtr)gch);
gch.Free();
Не забудьте вызвать
Free
, когда закончите свои дела!
Иногда в
C#
приходится самому освобождать память. Чтобы получить доступ к
pointer lparam
внутри перечислителя, используйте
GCHandle.Target
C#
public
static
bool
MyEWP(
int
hwnd, IntPtr param)
{
GCHandle gch = (GCHandle)param;
MyClass c = (MyClass)gch.Target;
// ... пользуемся
return
true;
}
Ниже показан написанный мной класс, который инкапсулирует
EnumWindows
в массив.
Вместо того чтобы возиться со всеми этими делегатами и обратными вызовами, вы пишете:
C#
WindowArray wins =
new
WindowArray();
foreach
(
int
hwnd
in
wins)
{
// делаем тут что-нибудь ...
}
C#
Файл
ListWin.cs
//
WinArray
генерирует
ArrayList
окон верхнего уровня используя
EnumWindows
using
System;
using
System.Collections;
using
System.Runtime.InteropServices;
namespace
WinArray
{
public
class
WindowArray
: ArrayList
{
private
delegate
bool
EnumWindowsCB(
int
hwnd, IntPtr param);
// Объявляются как
private
, потому что нужны лишь мне
[
DllImport
(
"user32"
)]
private
static
extern
int
EnumWindows(EnumWindowsCB cb,
IntPtr param);
private
static
bool
MyEnumWindowsCB(
int
hwnd, IntPtr param)
{
GCHandle gch = (GCHandle)param;
WindowArray itw = (WindowArray)gch.Target;
itw.Add(hwnd);
return
true;
}
// Это единственный открытый (
public
) метод.
// Только его вам и надо вызывать.
public
WindowArray()
{
GCHandle gch = GCHandle.Alloc(this);
EnumWindowsCB ewcb =
new
EnumWindowsCB(MyEnumWindowsCB);
EnumWindows(ewcb, (IntPtr)gch);
gch.Free();
}
}
}
Небольшая программа
ListWin
(Приложение
ListWin.cs
), для перечисления окон верхнего уровня, позволяет просматривать списки
HWND
, имен классов, заголовков и прямоугольников окон, используя
RECT
или
Rectangle
.
← Предыдущая тема
Маршалинг (marshalling) в C#. Преобразование типов между управляемым кодом (managed code) и неуправляемым кодом (unmanaged code)
Следующая тема →
В приложении C# вызываем функции из моей dll (C++). Атрибут [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)]
Ваши Отзывы ...
1
комментариев
гость
12 октября 2021 20:01
Какая же тут годная информация. Без воды и пр :) Отличный сайт, автору респект :)
ответить
Вашe имя
Ваш комментарий
(www ссылки может добавлять только залогиненный пользователь)
+ картинку
Экскурсии по Москве: пешеходные, автобусные и речные прогулки на любой вкус
Объявления
Объявления
•
Загрузка и установка Microsoft Visual Studio
•
Скачать и установить Visual Studio 2022 (для изучения C#, написание программ: WPF, ASP.NET, ASP.NET Core, UWP, Miaui, Xamarin, Unity, MonoGame)
•
Скачать и установить Visual Studio 2019 (для изучения C#, написание программ: WPF, ASP.NET, ASP.NET Core, Xamarin, Unity, MonoGame)
•
Загрузка и установка Visual Studio 2017 (для изучения C#, написание программ: WPF, ASP.NET, ASP.NET Core, Xamarin, Unity, MonoGame)
Новое приложение для изучения C#
•
Создаем новое консольное приложение для изучения C#
Отладка кода
•
Debug.Assert(false) Отладка кода в C#
•
Для отладки, опция "Common Language Runtime Exceptions" увидеть исключения, когда выполняется программа C#
•
Атрибут [Obsolete("Мой метод устарел. Не используйте", false)] Предупреждение при компиляции кода в C#
Типы данных C#
•
C# типы данных: число (bool, char, byte, int, long, float, double, decimal), текст (string), перечисление (enum), класс (class), структура (struct)
•
Структура Boolean В C# это флаг со значениями true или false (bool) и методы для конвертации bool
•
Структура Int32 В C# это целое число со знаком (int) и методы для конвертации int
•
Структура Single В C# это число с плавающей запятой (float) и методы для конвертации float
•
var ... Переменная любого типа В C#. Пример: var str = "Hello!";
•
Тип dynamic В C#
•
Значения по умолчанию В C#
Хранение объектов в памяти. Удаление объектов из памяти
•
Ссылочные типы и типы значений В C#
•
Стэк (stack) - память для параметров метода и локальных переменных В C#
•
Heap - динамическая память доступная во время выполнения программы В C#
•
Интерфейс IDisposable. Пишем код для правильного освобождения неуправляемых ресурсов в деструкторе и в интерфейсе IDisposable В C#
•
Память. Сборщик мусора (garbage collector). Автоматическое освобождение памяти В C#
C# конвертация типов
•
C# конвертация строки в число (string → short, int, long, ushort, uint, ulong, float, double, decimal) | используем Culture (настройки системы)
•
C# конвертация числа в строку (int, double, short, ... → string) с требуемой точностью
Текст в C# (тип string и класс String)
•
Алгоритм пересечения прямоугольников
•
Что такое текст В C# ? Тип string и класс String. Методы для работы с текстом.
•
Length (длина строки в C#). Пример: string str1 = "Hello"; int v1 = str1.Length;
•
CompareTo (сравнивает текст с учетом регистра в C#). Пример: bool bIsSame = str1.CompareTo(str2)==0;
•
ToLower (конвертирует текст в нижний регистр в C#). Пример: string str1 = "HELLO World!"; string str2 = str1.ToLower();
•
ToUpper (конвертирует текст в верхний регистр в C#). Пример: string str1 = "Hello World!"; string str2 = str1.ToUpper();
•
Split (разбить строку на слова в C#). Пример: string[] arrWords = strText.Split(' ');
•
StartsWith (проверяет начало текста с указанным текстом с учетом регистра в C#). Пример: bool bStart = str1.StartsWith(str2);
•
Contains (проверяет содержит текст указанный текст или нет с учетом регистра в C#). Пример: bool bFound = str1.Contains(str2);
•
IndexOf (ищет строку с учетом регистра и возвращает позицию в C#). Пример: int pos = str1.IndexOf(str2);
•
Substring (возвращает часть текста с указанной позиции и длиной В C#). Пример: string str1 = "Hello World!"; string str2 = str1.Substring(2, 5);
•
IsNullOrEmpty (проверяет текст на пустой или на null В C#). Пример: string name = "Hello World!"; bool bFlag = String.IsNullOrEmpty(name);
•
IsNullOrWhiteSpace (проверяет текст на null или на текст с пробелами В C#). Пример: string name = " "; bool bFlag = String.IsNullOrWhiteSpace(name);
•
[] (возвращает символ с указанной позиции В C#). Пример: char symbol = str[1];
•
Format (форматирование текста, строки В C#). Пример: string strNew = String.Format("Hello {0}, {1}", name, year);
•
+ (добавление строк и текста В C#). Пример: string str = str1 + str2 + " people!";
•
$ (интерполяция строк В C#). Пример: string result = $"Hello {a} + {b} = {a + b}";
•
Символ @ перед началом строки В C#. Пример: string str1 = @"aaa";
•
Используем вместе @ и $ (интерполяцию строк в C#)
DateTime (дата и время) в C#
•
Что такое DateTime в C# ? Конвертация в строку с форматом
Перечисления в C# (enum)
•
Что такое перечисление (enum) В C# ?
•
Как преобразовать текст в enum в C#
•
Как перечислить все элементы в enum в C#
null
•
null значение для простых типов. Используем ? или Nullable В C#
•
Оператор ?? (null-объединение) В C#
try-catch
•
Обработка исключений в C#. Оператор try catch finally
Классы в C# (class)
•
Что такое класс В C#?
•
Модификаторы доступа класса В C#. Модификаторы доступа для методов, свойств, полей В C#
•
'partial class' В C#. Описание класса в разных файлах
Конструкторы для класса
•
Конструктор класса В C#
•
Инициализация объекта класса (установка значений для полей) В C#
•
Вызов конструктора у базового класса В C#
•
Статический конструктор в классе C#
•
'base' Для вызова метода из базового класса. Для вызова переменной из базового класса. Для вызова конструктора из базового класса. C#
•
'this' Для установки или получения значения у поля класса. Для вызова конструктора из класса. C#
Деструкторы для класса
•
Деструктор класса В C#
•
Деструкторы в классах (как вызываются базовые деструкторы) C#
Наследование
•
Что такое наследование класса в C# ?
Наследование с использованием new
•
Используем new для метода интерфейса. Наследование интерфейса от интерфейса с одинаковым методом
•
Используем new для метода класса. Наследование класса от класса в C#.
Наследование с использованием sealed
•
sealed class. Запрет наследоваться В C#
•
Наследование класса от класса в C#. Используем слова virtual, override, sealed для методов класса
Абстрактный класс
•
Что такое абстрактный класс В C# ? Абстрактные методы, свойства, индексы.
•
Наследование от класса abstract В C#. Используем abstract и override для методов класса
Константы и readonly поля в классе
•
Константы в классе C#
•
readonly . Для поля класса. Это поле только для чтения в C#
Свойства get и set в классе C# (аксессоры)
•
get set Свойства в классе C#
•
Наследование (virtual, override) для аксессоров get и set в C#
Операторы, индексаторы в C#
•
Операторы в классе C#. Перегрузка операторов: > < ++ + true false
•
Индексаторы в классе C#
Вложенные типы в C#
•
Вложенный класс, структура в C#
Параметры в методе класса C#
•
ref и out (возврат параметров по ссылке в методе) C#. Пример: public void AddValue(ref int value)
•
Параметры по умолчанию (необязательные параметры) в методе C#. Пример: public int CalculateSum(int a, int b, int c=7)
•
Именованные параметры C#. Пример: public void CalculateSum(a:7, b:3);
Универсальные методы, универсальные классы в C# (шаблоны)
•
Метод с универсальными параметрами в C# (шаблоны). Пример: public double Sum<T1, T2>(T1 value1, T2 value2) { ... }
•
Обобщенный (типизированный) класс в C# (шаблоны). Пример class Book<T> { ... }
•
where Ограничение типа в обобщенном (типизированном) классе в C# (шаблоны). Пример class Dog<T> where T : Cat
Преобразование объекта класса из одного типа в другой
•
explicit это явный оператор преобразования в классе C#
•
implicit это неявный оператор преобразования в классе C#
•
Преобразование объекта класса из одного типа в другой в C#. Используем try ( ) is as
•
Преобразование объекта класса из одного типа в другой в C#. Используем pattern matching is switch
Объект класса в C#
•
? оператор условного null в C#
•
Объект класса содержит ссылку в C#
•
Как чтобы при копировании объектов в C# копировались данные класса, а не ссылка?
Статический конструктор и статические свойства и методы
•
Статический конструктор в классе C#
•
Статические методы, свойства, члены в классе C#
Дополнительные возможности класса в C#
•
Метод расширения в C# (this в первом параметре метода). Пример: static public void AddValues(this List<int> myList, int value1, int value2)
Правила именования классов в C#
•
Какими буквами строчными или заглавными называть классы, методы, свойства ... в C#
•
Правильно ли для каждого класса в C# создавать свой .cs файл? Или писать классы C# в одном .cs файле?
Статический класс
•
Статический класс в C#
Анонимный класс
•
Объект с анонимным (отсутствующим) типом в C#. Пример: var book = new { BookName = "Властелин Колец", Price = 100 };
Интерфейсы
•
Что такое interface в C# ?
•
Наследование interface от interface в C#
•
Наследование класса от класса от interface в C#. Используем override и virtual для методов класса
•
Обобщенный (типизированный) интерфейс в C# (шаблоны). Пример interface IUser<T> { ... }
Структура struct
•
Что такое структура в C#?
•
Модификаторы доступа структуры в C#. Модификаторы доступа для методов, свойств, полей структуры в C#
•
Инициализация объекта структуры (установка значений для полей) в C#
•
Как поменять значение в массиве структур или в коллекции структур (List) в C#
•
Вложенная структура в C#
Преобразование объекта структуры из одного типа в другой
•
implicit это неявный оператор преобразования структуры в C#
•
explicit это явный оператор преобразования структуры в C#
Отложенная загрузка class Lazy в C#
•
Отложенное создание объекта в памяти (class Lazy в C#)
Кортежи (tuple)
•
Кортежи (tuple) в C#
Динамические объекты с любыми свойствами
•
DynamicObject и ExpandoObject в C#
Массивы
•
Что такое массивы? array в C#
•
Инициализация массива (заполнение элементов массива array) в C#
•
params передача любого количества параметров в метод в C#
•
Класс Array (для работы с массивом) C#
Коллекции
•
Что такое коллекции в C# ?
•
Что такое необобщенные коллекции в C# ? Классы ArrayList, Stack, Queue, Hashtable, SortedList, BitArray
•
Что такое обобщенные (типизированные) коллекции в C# ? Классы List<T>, SortedList<T>, Stack<T>, Dictionary<TKey,TValue>, LinkedList<T>, Queue<T>, HashSet<T>, SortedSet<T>, ConcurrentDictionary<TKey, TValue>, SortedDictionary<TKey, TValue>
Классы необобщенных коллекций (в одной коллекции хранятся элементы разного типа)
•
Интерфейс IEnumerable. Самый базовый интерфейс для коллекций в C#
•
Интерфейсы: ICollection, IList, IDictionary. Основа для коллекций в C#
Класс ArrayList (коллекция в C#)
•
Что такое ArrayList в C# ?
Класс SortedList (коллекция в C#)
•
Что такое SortedList в C# ?
Класс Stack (коллекция в C#)
•
Что такое Stack в C# ?
Класс Queue (коллекция в C#)
•
Что такое Queue в C# ?
Класс Hashtable (коллекция в C#)
•
Что такое Hashtable в C# ?
Класс BitArray (коллекция в C#)
•
Что такое BitArray в C# ?
Классы обобщенных, типизированных коллекций в C# (в одной коллекции хранятся элементы одного типа)
•
Интерфейс IEnumerable<T>. Самый базовый интерфейс для типизированных коллекций в C#
•
Интерфейсы: ICollection<T>, IList<T>, ISet<T>, IDictionary<TKey, TValue>. Основа для типизированных коллекций в C#
Класс List<T> (типизированная коллекция в C#)
•
Что такое List<T> в C# ?
•
Инициализация коллекции List в фигурных скобках В C#
•
for, foreach (проходим все элементы в List<T>) в C#
•
Find (ищем элемент по критерию в List<T>) в C#
•
FindAll (ищем список элементов по критерию в List<T>) в C#
•
ForEach (для каждого элемента List<T> выполняется действие) в C#
Класс LinkedList<T> (типизированная коллекция в C#)
•
Что такое LinkedList<T> в C# ?
Класс SortedList<TKey, TValue> (типизированная коллекция в C#)
•
Что такое SortedList<TKey, TValue> в C# ?
Класс Stack<T> (типизированная коллекция в C#)
•
Что такое Stack<T> в C# ?
Класс Queue<T> (типизированная коллекция в C#)
•
Что такое Queue<T> в C# ?
Класс HashSet<T> (типизированная коллекция в C#)
•
Что такое HashSet<T> в C# ?
•
Как устроен HashSet<T> в C#
Класс SortedSet<T> (типизированная коллекция в C#)
•
Что такое SortedSet<T> в C# ?
Класс ObservableCollection<T> (типизированная коллекция в C#)
•
Что такое ObservableCollection<T> в C# ?
Класс Dictionary<TKey, TValue> (типизированная коллекция в C#)
•
Что такое Dictionary<TKey, TValue> в C# ?
•
Инициализация элементов в конструкторе Dictionary<TKey, TValue> в C#
•
Как устроен Dictionary<TKey, TValue> в C#
•
Как в C# сконвертировать IEnumerable в → Dictionary<TKey, TValue> . Используем метод ToDictionary
Класс SortedDictionary<TKey, TValue> (типизированная коллекция в C#)
•
Что такое SortedDictionary<TKey, TValue> в C# ?
Класс ConcurrentDictionary<TKey, TValue> (типизированная коллекция в C#)
•
Что такое ConcurrentDictionary<TKey, TValue> в C# ?
•
AddOrUpdate (добавить или обновить значение по ключу в ConcurrentDictionary<TKey, TValue>) в C#
Асимптотическая сложность для добавления, удаления, взятия элемента в коллекциях
•
Асимптотическая сложность для добавления, удаления, взятия элемента в коллекциях C# (List, SortedList, Stack, Dictionary, LinkedList, Queue, HashSet, SortedSet, ConcurrentDictionary, SortedDictionary)
Сортировка элементов в массиве [] и коллекции List
•
Сортировка элементов в массиве [] и коллекции List<T> в C#. Интерфейс IComparable
•
Сортировка элементов в массиве [] и коллекции List<T> в C#. Интерфейс IComparer
Моя реализация IEnumerator, IEnumerable и итераторы
•
Пример: Моя реализация интерфейсов IEnumerable и IEnumerator в C#
•
Итераторы и yield в C#. Примеры реализации IEnumerable с помощью yield
Методы расширения для IEnumerable
(поиск, замена, выборка значений) в C#
•
Методы поиска, замены, выборки значений в IEnumerable<T>. Методы расширений для IEnumerable<T> в C#
•
Any (метод расширения IEnumerable<T>) в C#
•
Select (метод расширения IEnumerable<T>) в C#
•
GroupBy (метод расширения IEnumerable<T>) В C#
•
GroupJoin (метод расширения IEnumerable<T>) В C#
Сортировка, фильтрация в LINQ (Language-Integrated Query)
•
Что такое LINQ в C# ?
•
Сортировка, фильтрация элементов списка с помощью LINQ в C#
•
Книги для изучения LINQ в C#
Указатели
•
Указатели в C#. Оператор unsafe
•
Указатели на структуры, поля классов, массивы в C# . Операторы unsafe, stackalloc, fixed
Работа с файлами
•
Открываем файл, читаем текст из файла и разбиваем по словам. C#
•
Создаем текстовый файл, пишем текст в файл C#
•
Создаем HTML файл, пишем табличные данные в HTML файл | C#
•
Создаем бинарный файл, пишем байты в файл C#
•
Частичная загрузка файла с FTP в C#
•
Класс Path. Метод Combine - объединяет строки в полный путь файла. И другие методы класса Path | C#
Сериализация
•
Что такое сериализация объекта в C# ? Атрибут [Serializable]
•
Сериализация C# объекта в бинарный файл. Класс BinaryFormatter. Атрибут [Serializable]
•
Сериализация C# объекта в XML файл. Класс XmlSerializer. Атрибут [Serializable]
•
Сериализация C# объекта в JSON файл. Класс DataContractJsonSerializer. Атрибут [Serializable]
•
Сериализация C# объекта в SOAP файл. Класс SoapFormatter. Атрибут [Serializable]
Пространства имен
•
Пространства имен namespace using в C#
Delegate
•
Делегат (delegate) в C#
•
Добавление метода(методов) в делегате C#. Объединение делегатов. Удаление метода из делегата
•
Делегат как параметр в методе C#
•
Безымянный, анонимный метод в C# (метод описанный на месте параметра, делегата)
Универсальные делегаты
•
Универсальные, обобщенные делегаты в C# (шаблоны)
•
Универсальные делегаты Action, Predicate и Func в C#
События
•
События (event) в C#
Лямда
•
Лямда (пример) в C#
Регулярные выражения
Регулярные выражения в C#
•
Разбиваем текст на слова (регулярные выражения в c#)
•
Ставим * вместо фамилии после первой буквы (регулярные выражения в c#)
•
Разбиваем текст на слова (регулярные выражения в c#)
Процесс, модули процесса
•
Процесс в C# (класс Process)
•
Модули процесса в С# (класс ProcessModule)
Потоки, многопоточность
•
Потоки в C# (класс Thread)
•
Пул потоков в C# (Thread Pool)
•
В чем отличие background (фоновый поток) и foreground (на переднем плане поток) в C# ?
•
Синхронизация потоков в C#
Parallel Library Task (TPL) Параллельное программирование задач
•
Parallel Library Task (TPL). Библиотека параллельных задач в C#
•
Класс Parallel используя метод Invoke параллельно выполненяет методы, циклов for и foreach (на разных ядрах процессора) в C#
•
PLINQ распараллеливает LINQ запросы для выполнения на разных ядрах процессора в C#
Асинхронные методы (async и await)
•
class Task в C#
•
Асинхронное программирование в C# (async, await как оформлять)
•
Асинхронное программирование в C# (используем async, await и Task на примере)
•
Асинхронное программирование в C# (теория)
Домены приложений
•
Что такое Домены приложений в C# ? (класс AppDomain)
•
Пример "Информация о домене приложения" (имя текущего домена, перечисляем сборки) в C#
•
Пример "Создаем 2-ой домен приложения. Пишем класс в 1-ом домене и используем во 2-ом домене. MarshalByRefObject в C#
•
Пример "Загружаем 2-ой домен приложения из файла, запускаем вычисления, выгружаем 2-ой домен из памяти" в C#
Атрибуты
•
Атрибуты для класса, метода, свойства в C#
•
Атрибут [Conditional("AAA")] . Для компиляции игнорировать метод или свойство если не определен символ условной компиляции в C#
•
Атрибут [Obsolete("Мой метод устарел. Не используйте", false)] Предупреждение при компиляции кода в C#
•
Атрибут [Display(Name = "Sleep at night")] . Для хранения какого нибудь текста прикрепленного к переменной | C#
•
Аттрибут [Required(ErrorMessage = "Пожалуйста, введите название")] описывается для свойства в C# классе и требует чтобы свойство было заполнено, если не заполнено на экране ошибка ErrorMessage в ASP.NET MVC
•
Аттрибут [Remote("IsValidAuthor", "Home", ErrorMessage = "Enter correct author of book")] описывается для свойства в C# классе и проверяет это свойство на правильность на сервере через метод IsValidAuthor в conroller Home, если метод возвращает false, то на экране будет ошибка ErrorMessage в ASP.NET MVC
Рефлексия (отражение) reflection в C#
•
Оператор nameof в C# (имя класса, имя метода, имя переменной)
•
Что такое рефлексия (отражение) в C# ? Класс Type
•
Создание объекта класса и вызов конструтора с параметрами используя рефлексию (отражение) reflection в C#
•
Как получить информацию атрибута для метода у класса. Используем reflection (отражение)
•
Как получить информацию атрибута для свойства у класса. Используем reflection (отражение)
Директивы препроцессора (if при компиляции)
•
Директивы препроцессора #define #undef #if #elif #else #endif в C#
•
Как определить #define для всех файлов (для всего проекта) в С# ?
Что такое сборка и исполняющая среда CLR ?
•
Сборка (Assembly) в C#. Компиляция. Промежуточный код IL (Intermediate Language). Метаданные.
•
Как подключить C# сборку в проект?
•
Утилита ildasm.exe. Конвертирует сборку (C# exe, dll файл) в промежуточный язык IL (Intermediate Language). Эта утилита удобна для изучения
•
Исполняющая среда CLR (Common Language Runtime) в C# . JIT (Just-In-Time) компилятор.
Создание и подключение нашей сборки
•
Создание нашей C# сборки (обычная сборка)
•
Подключение нашей C# сборки (обычная сборка)
▷
•
Создание нашей C# сборки (разделяемая сборка)
•
Подключение нашей C# сборки (разделяемая сборка)
База данных в консольном приложении C#
•
Entity Framework в консольном приложении C#. Используем Code First (пишем c# код, а таблицы в базе данных создаются сами)
•
Читаем картинку из базы данных и сохраняем в файл | ADO.NET, C#, консольное приложение
Внедрение зависимостей (Dependency Injection) DI в C#
•
Dependency Injection (DI) Внедрение зависимостей в C#
•
Ninject (IoC-контейнер) управление зависимостями в C#
•
Autofac (IoC-контейнер) управление зависимостями в C#
Удобные утилиты Visual Studio
•
Графическая диаграмма классов в C# (View Class Diagram)
exe to C# code
•
"dotPeek" application for decompile (disassemble) exe to c# source code
В приложении C# вызываем C++ функции
•
Что такое управляемый код (managed code) и неуправляемый код (unmanaged code) ? | C# и C++
•
Маршалинг (marshalling) в C#. Преобразование типов между управляемым кодом (managed code) и неуправляемым кодом (unmanaged code)
•
В приложении C# вызываем функции из Windows dll (C++ WinAPI). Атрибут [DllImport("user32.dll")]
•
В приложении C# вызываем функции из моей dll (C++). Атрибут [DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)]
Дополнительные темы, вопросы
•
Не создается новый проект в Visual Studio 2019. Ошибка "Object reference not set to instance of an object"
•
Ошибка компиляции C#: error CS1106: Extension method must be defined in a non-generic static class
•
Ошибка компиляции C#: error CS0246: The type or namespace name 'Point' could not be found (are you missing a using directive or an assembly reference?)
•
Почему метод Dictionary.TryGetValue не может найти значение по ключу в C# ?
•
Объектно-ориентированное программирование (ООП). Принципы ООП: абстрагирование, инкапсуляция, наследование, полиморфизм
•
Какими буквами в C# (заглавными или строчными или прописными) называть поля, методы в классе, интерфейсы, делегаты, параметры ?
•
Правильно ли для каждого класса в C# создавать свой .cs файл? Или писать классы C# в одном .cs файле?
•
Что лучше использовать встроенный тип int или класс Integer (тип string или класс String) на C#?
•
Как скачать и установить нужную .NET Framework версию в Visual Studio ?
•
Упаковка и распаковка значимых типов в C# (boxing/unboxing)
•
Error CS8107 Feature 'default literal' is not available in C# 7.0. Please use language version 7.1 or greater
•
Error "unable to connect to web server "iis express" | C# | Visual Studio 2017
•
Удаляем и устанавливаем NuGet в Visual Studio
•
При открытии проекта в Visual Studio 2019 ошибка: "project requires 'SQL Server 2012 Express LocalDB' which is not installed on this computer"
Математические операторы checked и unchecked
•
Математический оператор unchecked в C#
•
Математический оператор checked в C#
Дополнительный C# классы
•
C# класс Random
•
C# структура Point
•
C# структура PointF
•
C# структура Size
•
C# структура SizeF
•
C# структура Rectangle
•
C# структура RectangleF
Время
•
Время, истекшее с момента загрузки системы (в миллисекундах). System.Environment.TickCount в C#
Шифрование / Cryptography
•
Зашифруем пароль и проверим | C# console application
Excell
•
Чтение excel файла на C# (сonsole application)
WWW сайты для изучения C#
•
Сайты для изучения C#
Ваши вопросы присылайте по почте:
info@dir.by