Откройте Visual Studio. Создайте новый проект. В шаблонах выберите Other Languages / Visual C++ / Win32 / Консольное приложение Win32. В поле имя введите имя проекта, например libCounter. Имя созданной библиотеки будет иметь такое же название, как и имя проекта.
Появляется окно мастера приложений. Next.
Application type выберите DLL, а в Additional options выберите Empty project.
Application type выберите DLL, а в Additional options выберите Empty project.
Visual Studio создала проект.
Выберите папку Resource Files. Правая кнопка мыши. Add. New Item.
В окне мастера выберите C++ File (.cpp). В поле Name введите имя файла, например main.
Внимание!!! По умолчанию расширение файла .cpp. Удалите буквы рр, что бы расширение было .с
Нажмите Add.
Внимание!!! По умолчанию расширение файла .cpp. Удалите буквы рр, что бы расширение было .с
Нажмите Add.
Введите код. Скомпилируйте, но не запускайте на выполнение. Ниже приведен синтаксис, как должна выглядеть функция.
Синтаксис:
тип __declspec(dllexport)имя_метода([список_параметров]) {
//тело функции;
}
тип __declspec(dllexport)имя_метода([список_параметров]) {
//тело функции;
}
main.c
unsigned
short
showStart;
unsigned
short
showEnd;
double
price;
void
__declspec(dllexport) Set(unsigned
short
arg0, unsigned
short
arg1,
double
arg2) {
-
showStart = arg0;
-
showEnd = arg1;
-
price = arg2;
}
unsigned
short
__declspec(dllexport) ResultShow() {
-
return
(showEnd - showStart);
}
double
__declspec(dllexport) Sum() {
-
return
(
double
)(ResultShow() * price);
}
unsigned
short
showStart;
unsigned
short
showEnd;
double
price;
void
__declspec(dllexport) Set(unsigned
short
arg0, unsigned
short
arg1,
double
arg2) {
-
showStart = arg0;
-
showEnd = arg1;
-
price = arg2;
}
unsigned
short
__declspec(dllexport) ResultShow() {
-
return
(showEnd - showStart);
}
double
__declspec(dllexport) Sum() {
-
return
(
double
)(ResultShow() * price);
}
Создайте приложение на C#.
Что бы доступ к файлу библиотеки был общим, его нужно скопировать в системную папку C:\Windows\System32, где хранятся библиотеки.
Если нужно, что бы доступ имела только определенная программа, написанная на языке C#, то нужно скопировать файл библиотеки в папку bin\Debug этой программы. В данном примере, файл библиотеки был скопирован в папку bin\Debug этой программы.
При объявлении внешнего метода используется модификатор extern, так же нужно указать в объявлении, что такой метод должен быть открытым public и статическим static.
Внимание!!! Каждому объявлению метода предшествует атрибут DllImport.
Синтаксис:
[DllImport("имя_библиотеки.dll",CharSet = CharSet.Unicode)]
public static extern тип имя_метода(список_параметров);
Введите код.
Если нужно, что бы доступ имела только определенная программа, написанная на языке C#, то нужно скопировать файл библиотеки в папку bin\Debug этой программы. В данном примере, файл библиотеки был скопирован в папку bin\Debug этой программы.
При объявлении внешнего метода используется модификатор extern, так же нужно указать в объявлении, что такой метод должен быть открытым public и статическим static.
Внимание!!! Каждому объявлению метода предшествует атрибут DllImport.
Синтаксис:
[DllImport("имя_библиотеки.dll",CharSet = CharSet.Unicode)]
public static extern тип имя_метода(список_параметров);
Введите код.
Main.cs
using
System;
//подключить пространство имен
using
System.Runtime.InteropServices;
class
Program {
-
[DllImport(
"libCounter.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
void
Set(
ushort
arg0,
ushort
arg1,
double
arg2);
-
[DllImport(
"libCounter.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
double
Sum();
-
public
static
int
Main() {
-
Console.WriteLine(
"оплата за электроэнергию\n"
);
-
Console.Write(
"Введите начальные показания счетчика : "
);
-
ushort
show_start =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите конечные показания счетчика : "
);
-
ushort
show_end =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите цену за 1 кВт/ч : "
);
-
double
price =
double
.Parse(Console.ReadLine());
-
Set(show_start, show_end, price);
-
Console.WriteLine(
"Сумма за электроэнергию : {0:F}"
, Sum());
-
Console.ReadKey();
-
return
0;
-
}
}
using
System;
//подключить пространство имен
using
System.Runtime.InteropServices;
class
Program {
-
[DllImport(
"libCounter.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
void
Set(
ushort
arg0,
ushort
arg1,
double
arg2);
-
[DllImport(
"libCounter.dll"
, CharSet = CharSet.Unicode)]
-
public
static
extern
double
Sum();
-
public
static
int
Main() {
-
Console.WriteLine(
"оплата за электроэнергию\n"
);
-
Console.Write(
"Введите начальные показания счетчика : "
);
-
ushort
show_start =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите конечные показания счетчика : "
);
-
ushort
show_end =
ushort
.Parse(Console.ReadLine());
-
Console.Write(
"Введите цену за 1 кВт/ч : "
);
-
double
price =
double
.Parse(Console.ReadLine());
-
Set(show_start, show_end, price);
-
Console.WriteLine(
"Сумма за электроэнергию : {0:F}"
, Sum());
-
Console.ReadKey();
-
return
0;
-
}
}
оплата за электроэнергию
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84
Введите начальные показания счетчика : 0
Введите конечные показания счетчика : 100
Введите цену за 1 кВт/ч : 0,3084
Сумма за электроэнергию : 30,84