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


Автор: Vezd 5.6.2011, 22:04
Мне в C# надо использовать библиотеку, написанную на С. Для этой цели, как я понял, используется враппер.

Что представляет из себя враппер, это один dll файл?
Нужно подключать только враппер, а библиотека подключается автоматически?

Где должны лежать файлы библиотеки и враппера?

Автор: jonie 6.6.2011, 09:40
встречный вопрос: что вы уже прочитали про PInvoke и\или взаимодействие с COM в C# ? А также какую книжку вы выбрали, где есть глава "взаимодействие с унаследованным кодом" ?

Автор: mur88 6.6.2011, 10:34
Вызов библиотечной  функции С, из C#

Автор: Vezd 6.6.2011, 11:44
jonie, а где об этом всем можно почитать? в каких именно книгах? нашел книгу Эндрю Троелсен. C# и платформа .Net, сейчас читаю соответствующую главу.
Как враппер подключить кажется я понял. И враппер нужен для других неуправляемых dll, которые лежать в библиотеке. А как подключаются эти неуправляемые dll? их враппер сам подключает? и где должны лежать файлы библиотеки и неуправляемые dll?

Автор: jonie 6.6.2011, 20:11
Цитата

А как подключаются эти неуправляемые dll? их враппер сам подключает? 
системным вызовом LoadLibraryEx  (kernel32.dll) из WinAPI, вам не надо особо заботится об этом - главное чтобы неуправляемая длл-ка была доступна по переменной среды %path% или в другом месте, где ее сможет найти LoadLibraryEx (поробнее о местах поиска почитайте по справке [http://msdn.microsoft.com/en-us/library/ms684175%28VS.85%29.aspx] или тут [http://www.flounder.com/loadlibrary_explorer.htm])

Автор: Vezd 7.6.2011, 00:06
Скачал с сайта http://www.sdss.jhu.edu/~tamas/bytes/fftwcsharp.html враппер и скачал библиотеку http://fftw.org/#documentation. Поместил dll враппер в папку с библиотекой, где лежат exe и неуправляемые dll и другие файлы библиотеки. Подключил dll враппер. Попробовал осуществить пример, на основе кода, предоставленного на первом сайте.

Но при первом же обращении к библиотеке
Код
pin = fftwf.malloc(n*8);

вылезает ошибка: Не удается загрузить DLL "libfftw3f-3.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)

Мне где то посоветовали тогда написать(как раз   LoadLibrary используется):
Код

[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
static extern IntPtr LoadLibrary(string filename);

IntPtr handle = LoadLibrary(Path.GetFullPath(@"libfftw3f-3.dll"));

if (handle != IntPtr.Zero)
{
    // TODO: Работа с библиотечными методами
}
else
{
    int error = Marshal.GetLastWin32Error();

    // TODO: Обработка ошибки
}



В результате я написал вот это:
Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using fftwlib;
using System.IO;

namespace fure
{
    public class fftwtest
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr LoadLibrary(string filename);

        IntPtr handle = LoadLibrary(Path.GetFullPath(@"libfftw3f-3.dll"));
        
        //pointers to unmanaged arrays
        IntPtr pin, pout;
               
        // Initializes FFTW and all arrays
        // n: Logical size of the transform
        public void InitFFTW(int n)
        { 
            if (handle != IntPtr.Zero)
            {
                //create two unmanaged arrays, properly aligned
                pin = fftwf.malloc(n * 8);
                pout = fftwf.malloc(n * 8);

                Console.WriteLine("загрузилась");
                Console.Read();
             }
                 else
                 {
                   int error = Marshal.GetLastWin32Error();
                   Console.WriteLine(error);
                   Console.Read();
                  }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            fftwtest test = new fftwtest();
            test.InitFFTW(10);
        }
    }
}


Но лучше не стало, ошибка все та же: Не удается загрузить DLL "libfftw3f-3.dll": Не найден указанный модуль. (Исключение из HRESULT: 0x8007007E)
Что же делать?
Также вопрос: в библиотеке три DDL файла, для всех трех надо использовать LoadLibrary?

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