He creado un dll C++ que me gustaría llamar desde el código C#. Puedo llamar a una función, pero la otra arroja una excepción cuando el código C# intenta cargar la dll.Exportación de funciones de C++ dll a C# P/Invoke
La cabecera tiene el siguiente aspecto: (¿qué significa foo = foo en el campo de nombre)
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
Esto produce una DLL con mesa de exportaciones ligeramente confuso:
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
Mi P/Las declaraciones de invocación tienen este aspecto:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
La llamada para instalar devuelve sin excepción, pero cuando llamo a PPPConnec t, obtengo una MissingMethodException - "No se puede encontrar un punto de entrada 'PPPConnect' en una DLL de PInvoke 'PPPManager.dll'."
He intentado eliminar las directivas extern y declspec de la declaración de la función de instalación, de modo que PPPConnect es la única función exportada, y esto todavía no me permite llamar a PPPConnect.
También he intentado hacer el DllImport por ordinal; esto da el mismo resultado que llamar por nombre - Instalar devoluciones, pero PPPConnect arroja la excepción "No se puede encontrar un Punto de entrada '# 2' ...".
El registro de interoperabilidad da:
[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();
Esto es bien fuera de mi área de especialización, por lo que cualquier sugerencia o pensamientos sería bienvenido.
Gracias, Paul
edición: Resulta que este código hace el trabajo; el problema era que la última dll no se propagaba al dispositivo. D'oh!
nunca he oído hablar de este registro de interoperabilidad - ¿cómo se puede activar/opinión de que? – Charlie
http://blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx Empecé a usarlo para intentar solucionar este problema, pero parece que me hubiera ahorrado un montón de tiempo de depuración MissingMethodExceptions. – Symmetric