2009-11-19 10 views
2

J'ai une DLL d'extension MFC que je veux utiliser dans une application C#. Les fonctions que je suis exposant sont des fonctions C, à savoir que je suis les exporter comme ceC# DllImport Extension MFC DLL et nom Mangling

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

Les fonctions utilise en interne classes MFC, alors que dois-je faire pour utiliser la DLL en C# en utilisant P/Invoke.

Deuxièmement, je veux utiliser la surcharge de fonction, mais autant que je sache, C ne supporte pas la surcharge de fonctions et si j'exporte des fonctions C++, elles seront mutilées. Alors, que puis-je faire pour remédier à ce problème? Pouvons-nous importer des fonctions mutées C++ en utilisant DllImport.

Répondre

9

Avoir cette déclaration dans l'en-tête:

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

Vous pouvez utiliser dumpbin.exe pour obtenir le nom exact de la fonction:

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 

Et utiliser ce nom lors de la déclaration de la fonction:

[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); 

Une autre alternative consiste à utiliser un module definition file:

LIBRARY "unmanaged" 
EXPORTS 
    [email protected]@[email protected] 
    [email protected]@YAHXZ 

Dans ce cas, vous ne devez plus utiliser __declspec(dllexport) et votre fichier d'en-tête pourrait ressembler à ceci:

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

Et enfin les importer:

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

[DllImport(@"D:\work\unmanaged.dll")] 
static extern int fn2(int a); 
+0

Cette réponse m'a été très utile –

2

Une DLL d'extension MFC attend un objet CWinApp dans l'appelant. Vous n'en avez pas en C#. Envelopper la DLL à l'aide d'une DLL régulière MFC, qui possède un objet CWinApp.

+0

Que voulez-vous dire? Pouvez-vous s'il vous plaît expliquer un peu? – akif

+1

Appel de code MFC AfxGetApp partout. –