2009-11-19 3 views
2

У меня есть DLL расширения MFC, которую я хочу использовать в приложении C#. Функции Я обнажая являются функциями C, т.е. я их экспорт, как этогоC# DllImport Расширение MFC DLL и имя Mangling

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

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

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

ответ

9

Имея это заявление в заголовке:

__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 [email protected]@[email protected] = @ILT+105([email protected]@[email protected]) 
      2 1 00011159 [email protected]@YAHXZ = @ILT+340([email protected]@YAHXZ) 

    Summary 

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

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

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

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

Другой альтернативой является использование module definition file:

LIBRARY "unmanaged" 
EXPORTS 
    [email protected]@[email protected] 
    [email protected]@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); 
+0

Этот ответ был очень полезен для меня –

2

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

+0

Что значит? Не могли бы вы немного объяснить? – akif

+1

MFC кодовый вызов AfxGetApp повсюду. –