![](/user_photo/1144_wzNgE.jpg)
- •Работа с неуправляемым кодом
- •Управляемый и неуправляемый код
- •Службы Platform Invoke
- •Службы com Interoperability
- •Обзор механизма преобразования
- •Работа службы Platform Invoke. Запуск функций WinApi
- •Управляемая библиотека
- •Управляемая библиотека в управляемом коде
- •Управляемая библиотека в неуправляемом коде
- •Вызов неуправляемых функций из управляемого модуля
- •Идентификация вызываемой функции
- •Создание класса для размещения библиотечной функции
- •Прототипы в управляемом коде
- •Небезопасный код
- •Григорьев с. .Net и работа с неуправляемым кодом. Часть 1 / с. Григорьев [Электронный ресурс] : http://habrahabr.Ru/blogs/net/84076/
Управляемая библиотека
Для создания кода управляемой библиотеки в Visual Studio предусмотрены специальные опции. Новый проект создается как библиотека классов (Class Library). Сборка автоматически получает расширение .dll.
C# основывается на парадигме объектно-ориентированного программирования, поэтому библиотека классов представляет собой все то же объявление класса.
Методы – члены класса составляют основу функциональности библиотеки. Наличие пары явно определяемых конструкторов – вынужденная мера. Это требование со стороны модуля на C++, использующего библиотеку. Там невозможно создать объект без явным образом объявленных конструкторов умолчания и копирования:
using System;
namespace CSLib00
{
public class Class1
{
// Явное объявление конструктора без параметров.
public Class1()
{
}
// Явное объявление конструктора копирования.
// Конструктор с одним параметром – ссылкой на
// объект - представитель собственного класса.
// Именно такие конструкторы называются конструкторами
// копирования.
public Class1(Class1 cKey)
{
}
// Реализация функциональности. Метод - член класса Class1 Summ.
public int Summ(int key1, int key2)
{
Console.WriteLine("this is Summ from CSLib00.dll");
return (key1 + key2);
}
}
}
Управляемая библиотека в управляемом коде
Главная проблема, которая возникает при разработке приложения, использующего код управляемой библиотеки, – добавить ссылку (Add Reference) на библиотечную сборку. Для этого нужно указать месторасположение сборки в соответствующем диалоговом окне.
После этого Visual Studio копирует сборку в директорию, в которой располагается разрабатываемый код. При согласовании пространств имен (оператор using или использование полного имени с точечной нотацией) библиотечного модуля и модуля клиента, библиотечные классы и методы готовы к использованию в коде клиента:
using System;
namespace CSClient
{
class Program
{
static void Main(string[] args)
{
// Здесь используется точечная нотация.
// Явное указание принадлежности имени класса
// пространству имен CSLib00.
CSLib00.Class1 c1 = new CSLib00.Class1();
// Создали объект, затем вызываем метод!
Console.WriteLine("the res = {0}", c1.Summ(1, 2));
}
}
}
Управляемая библиотека в неуправляемом коде
Особенности разработки неуправляемого программного кода, использующего управляемую библиотеку, состоят в следующем:
неуправляемый код транслируется с опцией /clr;
добавляется ссылка на библиотечную сборку;
определяется управляемая функция, в теле которой с помощью оператора gcnew создается объект объявленного в управляемой библиотеке класса, от имени которого вызывается библиотечная функция.
#include "stdafx.h"
#using <mscorlib.dll>
using namespace System;
using namespace CSLib00;
#pragma managed
void managedLibStarter()
{
Class1 cl1 = gcnew Class1();
Console::WriteLine("{0}",cl1.Summ(1,2));
}
#pragma unmanaged
int _tmain(int argc, _TCHAR* argv[])
{
printf("QWERTY\n");
managedLibStarter();
return 0;
}
Вызов неуправляемых функций из управляемого модуля
Платформный вызов — это служба, которая позволяет управляемому программному коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например, функции библиотек Win32 API.
Служба платформного вызова обеспечивает поиск и вызов экспортируемой функции и в случае необходимости обеспечивает маршалинг её параметров (передачу параметров через границы процесса).
Маршалинг (от англ. marshal — упорядочивать), по смыслу похож на сериализацию, — процесс преобразования представления объекта в памяти в формат данных, пригодный для хранения или передачи. Обычно применяется, когда данные необходимо передавать между различными частями одной программы или от одной программы к другой.
Платформный вызов позволяет управлять значительной частью операционной системы посредством вызова функций Win32 API и других библиотек DLL. В дополнение к Win32 API, через платформный вызов доступны многие другие интерфейсы API и DLL.
Вызов неуправляемых функций средствами платформного вызова предполагает следующие действия:
идентификация вызываемой функции в библиотеке DLL;
создание класса для сохранения вызываемой функции;
объявление прототипа (!) вызываемой функции в управляемом коде;
вызов функции.
При вызове неуправляемой функции платформный вызов выполняет следующую последовательность действий:
определяется местонахождение DLL-библиотеки, содержащей функцию;
DLL загружается в память;
определяется месторасположение вызываемой функции (адрес функции в памяти);
значения параметров функции заносятся в стек;
в случае необходимости осуществляется маршалинг данных;
осуществляется передача управления неуправляемой функции.
В .NET определение местонахождения и загрузка DLL, а также определение местоположения адреса функции в памяти, выполняется только при первом вызове функции.