nieo Ответов: 2

Как я могу импортировать функцию DLL C++ с помощью p / invoke в C#?


у меня есть эта функция в c++, которая определена в заголовочном файле

MYDLL_API BOOL GetFolderSize(LPCTSTR lpszStartFolder, 
               BOOL bRecurse, 
               BOOL bQuickSize,
               PLARGE_INTEGER lpFolderSize,
               LPDWORD lpFolderCount /*= NULL*/,
               LPDWORD lpFileCount /*= NULL*/);


где MYDLL_API определяется как

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif



после компиляции его как DLL проект
я создаю объявление c# для этой функции следующим образом


[StructLayout(LayoutKind.Explicit, Size = 8)]
    struct LARGE_INTEGER
    {
        [FieldOffset(0)]
        public Int64 QuadPart;
        [FieldOffset(0)]
        public UInt32 LowPart;
        [FieldOffset(4)]
        public Int32 HighPart;
    }

  [DllImport("mydll.dll")]
    extern static bool GetFolderSize(string lpszStartFolder,
                               bool bRecurse,
                               bool bQuickSize,
                               out LARGE_INTEGER lpFolderSize,
                                out UInt32 lpFolderCount,
                                out UInt32 lpFileCount);


во время выполнения он не выдал исключения, но вернул false (означает, что функция не удалась )
Почему? является ли причина из-за сложного типа данных в c++ (PLARGE_INTEGER)
или что ??
спасибо

Что я уже пробовал:

я должен попробовать это

[StructLayout(LayoutKind. Explicit, Size = 8)]
структуру LARGE_INTEGER
{
[FieldOffset(0)]
public Int64 QuadPart;
[FieldOffset(0)]
public UInt32 LowPart;
[FieldOffset(4)]
public Int32 HighPart;
}

[DllImport("mydll.dll")]
extern static bool GetFolderSize(string lpszStartFolder,
боол bRecurse,
bQuickSize типа bool ,
out LARGE_INTEGER lpFolderSize,
из тип uint32 lpFolderCount,
из тип uint32 lpFileCount);

Richard MacCutchan

Единственный способ узнать ответ - это использовать отладчик. Мы не знаем, какие значения вы передаете функции и почему она возвращает false.

2 Ответов

Рейтинг:
2

Gregory Haberek

Библиотека, в которую вы звоните, использует ключевое слово cdecl соглашение о вызове, но по умолчанию для C# по WinAPI, а.к.а. нарушением соглашения о стандартном. Измените свой DllImport вместо этого позвоните, чтобы выглядеть вот так:

[DllImport("mydll.dll"), CallingConvention=CallingConvention.Cdecl)]
extern static bool GetFolderSize(string lpszStartFolder,
    bool bRecurse,
    bool bQuickSize,
    out LARGE_INTEGER lpFolderSize,
    out UInt32 lpFolderCount,
    out UInt32 lpFileCount);


Рейтинг:
1

#realJSOP

0) дважды убедитесь, что ваш прототип метода верен.

1) измените параметры " out " на "output".

2) Почему ты называешь неуправляемой библиотеке DLL что делать, когда .Net предоставляет точно такую же функциональность?