×
=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
Поиск
Программирование, разработка, тестирование
→
C# (язык программирования)
→
В приложении C# вызываем функции из Windows dll (C++ WinAPI). Атрибут [DllImport("user32.dll")]
Посмотрели
26577
раз(а)
Комментариев
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