Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП. Часть 3. Контрольная работа 1.doc
Скачиваний:
39
Добавлен:
01.04.2014
Размер:
238.59 Кб
Скачать
    1. Управляемая библиотека

Для создания кода управляемой библиотеки в 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);

}

}

}

    1. Управляемая библиотека в управляемом коде

Главная проблема, которая возникает при разработке приложения, использующего код управляемой библиотеки, – добавить ссылку (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));

}

}

}

    1. Управляемая библиотека в неуправляемом коде

Особенности разработки неуправляемого программного кода, использующего управляемую библиотеку, состоят в следующем:

  • неуправляемый код транслируется с опцией /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;

}

    1. Вызов неуправляемых функций из управляемого модуля

Платформный вызов — это служба, которая позволяет управляемому программному коду вызывать неуправляемые функции, реализованные в библиотеках динамической компоновки (DLL), например, функции библиотек Win32 API.

Служба платформного вызова обеспечивает поиск и вызов экспортируемой функции и в случае необходимости обеспечивает маршалинг её параметров (передачу параметров через границы процесса).

Маршалинг (от англ. marshal — упорядочивать), по смыслу похож на сериализацию, — процесс преобразования представления объекта в памяти в формат данных, пригодный для хранения или передачи. Обычно применяется, когда данные необходимо передавать между различными частями одной программы или от одной программы к другой.

Платформный вызов позволяет управлять значительной частью операционной системы посредством вызова функций Win32 API и других библиотек DLL. В дополнение к Win32 API, через платформный вызов доступны многие другие интерфейсы API и DLL.

Вызов неуправляемых функций средствами платформного вызова предполагает следующие действия:

  • идентификация вызываемой функции в библиотеке DLL;

  • создание класса для сохранения вызываемой функции;

  • объявление прототипа (!) вызываемой функции в управляемом коде;

  • вызов функции.

При вызове неуправляемой функции платформный вызов выполняет следующую последовательность действий:

  • определяется местонахождение DLL-библиотеки, содержащей функцию;

  • DLL загружается в память;

  • определяется месторасположение вызываемой функции (адрес функции в памяти);

  • значения параметров функции заносятся в стек;

  • в случае необходимости осуществляется маршалинг данных;

  • осуществляется передача управления неуправляемой функции.

В .NET определение местонахождения и загрузка DLL, а также определение местоположения адреса функции в памяти, выполняется только при первом вызове функции.