Ho creato una DLL C++ che vorrei chiamare dal codice C#. Sono in grado di chiamare una funzione, ma l'altra genera un'eccezione quando il codice C# tenta di caricare la DLL.Esportazione di funzioni da C++ dll a C# P/Invoke
L'intestazione assomiglia a questo: (? Che cosa foo = foo dire nel campo del nome)
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Questo produce una DLL con tavolo esportazioni po 'confusa:
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
mio P/invocare dichiarazioni appaiono così:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
La chiamata a installare i rendimenti senza alcuna eccezione, ma quando chiamo PPPConnec t, Ottengo un MissingMethodException - "Impossibile trovare un punto di ingresso 'PPPConnect' in un PPPManager.dll 'PInvoke DLL."
Ho provato a rimuovere le direttive extern e declspec dalla dichiarazione della funzione Installa, in modo che PPPConnect sia l'unica funzione esportata e questo non mi consente di chiamare PPPConnect.
Ho anche provato a eseguire DllImport per ordinale; questo dà lo stesso risultato della chiamata per nome - Installa i ritorni, ma PPPConnect lancia l'eccezione "Impossibile trovare un punto di ingresso '# 2' ...".
Il registro di interoperabilità dà:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
Questo è ben al di fuori la mia area di competenza, quindi qualsiasi suggerimento o pensieri sarebbe il benvenuto.
Grazie, Paul
edit: Si scopre che questo codice funziona; il problema era che l'ultima DLL non veniva propagata al dispositivo. D'oh!
Non ho mai sentito parlare di questo registro di interoperabilità - come si fa a attivare/Vedi quello? – Charlie
http://blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx Ho appena iniziato a usarlo per provare a eseguire il debug di questo problema, ma sembra che mi avrebbe salvato un sacco di tempo di debug di MissingMethodExceptions. – Symmetric