C # DllImport MFC Расширение DLL и искажение имени - PullRequest
2 голосов
/ 19 ноября 2009

У меня есть DLL-библиотека расширения MFC, которую я хочу использовать в приложении C #. Функции, которые я представляю, являются функциями C, т.е. я экспортирую их следующим образом

extern "C"
{
 __declspec(dllexport) bool Initialize();
}

Функции внутренне используют классы MFC, так что я должен сделать, чтобы использовать DLL в C # с помощью P / Invoke.

Во-вторых, я хочу использовать перегрузку функций, но насколько я знаю, C не поддерживает перегрузку функций, и если я экспортирую функции C ++, они будут искажены. Так что я могу сделать, чтобы решить эту проблему? Можем ли мы импортировать искаженные функции C ++, используя DllImport .

Ответы [ 2 ]

9 голосов
/ 19 ноября 2009

Наличие этого объявления в заголовке:

__declspec(dllexport) int fnunmanaged(void);
__declspec(dllexport) int fnunmanaged(int);

Вы можете использовать dumpbin.exe , чтобы получить точное название функции:

dumpbin.exe /exports unmanaged.dll

Microsoft (R) COFF/PE Dumper Version 9.00.30729.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file unmanaged.dll

File Type: DLL

  Section contains the following exports for unmanaged.dll

    00000000 characteristics
    4B0546C3 time date stamp Thu Nov 19 14:23:15 2009
        0.00 version
           1 ordinal base
           2 number of functions
           2 number of names

    ordinal hint RVA      name

          1    0 0001106E ?fnunmanaged@@YAHH@Z = @ILT+105(?fnunmanaged@@YAHH@Z)
          2    1 00011159 ?fnunmanaged@@YAHXZ = @ILT+340(?fnunmanaged@@YAHXZ)

  Summary

        1000 .data
        1000 .idata
        2000 .rdata
        1000 .reloc
        1000 .rsrc
        4000 .text
       10000 .textbss

И используйте это имя при объявлении функции:

[DllImport(@"D:\work\unmanaged.dll",
    EntryPoint = "?fnunmanaged@@YAHH@Z",
    ExactSpelling = true)]
static extern int fnunmanaged();

[DllImport(@"D:\work\unmanaged.dll",
    EntryPoint = "?fnunmanaged@@YAHXZ",
    ExactSpelling = true)]
static extern int fnunmanaged(int a);

Другой альтернативой является использование файла определения модуля :

LIBRARY "unmanaged"
EXPORTS 
  fn1=?fnunmanaged@@YAHH@Z
  fn2=?fnunmanaged@@YAHXZ

В этом случае вам больше не нужно использовать __declspec(dllexport), и ваш заголовочный файл может выглядеть так:

int fnunmanaged(void);
int fnunmanaged(int);

И, наконец, импортируйте их:

[DllImport(@"D:\work\unmanaged.dll")]
static extern int fn1();

[DllImport(@"D:\work\unmanaged.dll")]
static extern int fn2(int a);
2 голосов
/ 19 ноября 2009

DLL-библиотека расширения MFC ожидает объект CWinApp в вызывающей стороне. У вас его нет в C #. Оберните библиотеку DLL, используя обычную библиотеку MFC с объектом CWinApp.

...