Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Подключение dll файла


Автор: kma 28.12.2005, 16:21
Есть “dll” файл, написанный на С++, подскажите, пожалуйста, как его можно подключить к своему проекту. Если можно дайте пример.

Зарине спасибо.

Автор: mr.DUDA 28.12.2005, 16:59
Есть такой атрибут [DllImport("mylib.dll")], ставим его над статическим методом (имя метода при этом совпадает с именем какой-нить ф-ции экспортируемой из длл) и пользуемся "как своим родным" методом класса. Типы аргументов - соответствующие: для int, double, bool, float - остаются как есть; строки типа char* и short* "как по волшебству" превращаются в string; структуры передаются как есть; указатели - через IntPtr.

Автор: kma 28.12.2005, 17:10
Спосибо за помощь smile


Я подключил системный файл “[DllImport("Kernel32.dll")]” и вызвал функцию “protected static extern IntPtr CreateFileA” . Пишет, что эта функция закрыта, что делать

Автор: mr.DUDA 28.12.2005, 17:27
Наверное, не надо указывать букву "А" или "W" в конце имени ф-ции, т.к. рантайм сам определит, какой вариант функции - юникодовский или ANSI'шный - использовать при вызове. Вот как ф. CreateFile используется в System.Microsoft.Win32.NativeMethods:

Код
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, NativeMethods.SecurityAttributes lpSecurityAttributes, 
int dwCreationDisposition, int dwFlagsAndAttributes, HandleRef hTemplateFile);

Автор: kma 28.12.2005, 17:37
Попробовал, но все равно пишет “new protected member declared in sealed class”

Автор: mr.DUDA 28.12.2005, 18:08
Цитата(kma @ 28.12.2005, 16:37)
Попробовал, но все равно пишет “new protected member declared in sealed class”

Эта ошибка не относится к DllImport, скорее всего просто класс, объявивший метод CreateFile, унаследован от sealed-класса. Нужно либо убрать наследование вообще, либо унаследоваться от другого класса.

Автор: kma 28.12.2005, 18:14
Я свой класс не от кого не наследовал

Автор: mr.DUDA 28.12.2005, 18:25
Код рабочий, файл создаёт:
Код
using System;
using System.Runtime.InteropServices;

class Test
{
    [StructLayout(LayoutKind.Sequential)]
    class SecurityAttributes
    {
        public int nLength;
        public IntPtr lpSecurityDescriptor;
        public bool bInheritHandle;
        public SecurityAttributes() {}
    }

 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    static extern IntPtr CreateFile(string lpFileName, int dwDesiredAccess,
 int dwShareMode, SecurityAttributes lpSecurityAttributes, int dwCreationDisposition, 
int dwFlagsAndAttributes, HandleRef hTemplateFile);

    static void Main(string[] args)
    {
        const int CREATE_ALWAYS = 2;
        const int GENERIC_WRITE = 0x40000000;

        SecurityAttributes sa = new SecurityAttributes();
        CreateFile("c:\\1.txt", GENERIC_WRITE, 0, sa, CREATE_ALWAYS, 0, new HandleRef(null, IntPtr.Zero));
    }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)