Как стать автором
Обновить

Импорт нативыных функций из динамической библиотеки в C#

Здравствуй %habrauser%! Свой первый пост я хотел бы посвятить импортированию нативных функций из DLL-библиотеки, написанных на Си, в программу на менеджет C#.

Как-то я, и мой товарищ, работали над некторым приложенем. Я писал на C#, а он, в свою очередь, на Си/С++. В виде первого подводного камня явилось то, как импортировать нативную функцию из DLL в С# код. Порыскали по сети и ничего толкового не обнаружили.
Что то похожее на правду было обнаружено в книге Г.Шилдта. И оно не заработало должным образом, выдавая ошибку после запуска приложения, ругаясь на то, что не найдена точка входа в необходимую функцию. Но после танцов с бубном цель была достигнута. И вот она:

Код тривиальной DLL на Си:

#include<stdlib.h>

extern “C” _declspec(dlexport) int Add(int a, int b)
{
return a + b;
}

Ключевой фигурой здесь являются модификатор extern “C” и _declspec(dlexport).
…и код тривиальной программы на C#:

using System;
using System.Runtime.InteropServices;

class ExternMeth
{
//Атрибут импорта необходимой библиотеки
[DllImport(“Add_lib.dll”)]
//Сама импортируемая функция
public extern static int Add(int a, int b);

static void Main()
{
int max=Add(10, 20);
Console.WriteLine(max);
}
}

И все работает как надо…
Только не забываем включить поддержку небезопасного кода в свойствах проекта.
Стоить отметить, что импорт пользовательских типов данных невозможен. Следовательно, что-то вроде импорта класса native-C++ из DLL удачей не закончится.
Все это оказывается полезным, когда есть необходимость в использовании InlineAssembler вместе с Си, впресcованной в DLL. Также это необходимо, когда вы намерены использовать функции из таких DLL’ок, как kernel32.dll и user32.dll, заранее посмотрев прототипы самих функций в windows.h и последующих заголовочных файлах, поключенных к ней, или просто в MSDN,.

Надеюсь, данная статья поможет тем, кто собирается смешивать нативный код на С и менеджет C# в своих проектах.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.