Ya un poco extrañado he decidido probarlo y a mi me funciona bien, la única diferencia con tu código es que todos mis archivos se llaman 'prova' y el nombre de la clase también claro.
Entonces una vez corriendo tendrás el problema de que setA y setB no te funcionarán puesto que utiliza this cuando en realidad no es una instancia del objeto, esto es porque desde c# declaras (estas obligado) la función como static cuando en realidad necesariamente debe ser miembro del objeto para poder acceder al valor de las variables para la instancia (this->a o this->b).
Probablemente este es el porque no se ven dlls con clases, no tiene mucho sentido si no vas a poder instanciar la clase desde el lenguaje que la utiliza.
Yo creo que tienes dos opciones, declarar static a y b o directamente pasar de la clases y hacerlo Cstyle x)
Te dejo tu código con las modificaciones que he hecho para que funcione.
Saludos!
prova.def:
LIBRARY prova
EXPORTS
getA
getB
setA
setB
multiplica
suma
nDLL_lib
fnDLL_lib
#define DLL_LIB_EXPORTS
#ifdef DLL_LIB_EXPORTS
#define DLL_LIB_API __declspec(dllexport)
#else
#define DLL_LIB_API __declspec(dllimport)
#endif
DLL_LIB_API double multiplica();
DLL_LIB_API int getA();
DLL_LIB_API int getB();
DLL_LIB_API void setA(int a);
DLL_LIB_API void setB(int b);
DLL_LIB_API int suma(void);
DLL_LIB_API int nDLL_lib=0;
DLL_LIB_API int fnDLL_lib(void);
#include "stdafx.h"
#include "prova.h"
int a;
int b;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
a=0;
b=0;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
// Ejemplo de función exportada.
DLL_LIB_API int fnDLL_lib(void)
{
return 42;
}
int suma(void)
{
return 5+5;
}
int getA()
{
return a;
}
int getB()
{
return b;
}
void setA(int pa)
{
a = pa;
}
void setB(int pb)
{
b = pb;
}
double multiplica()
{
return (double)a*b;
}
WindowsApplication1 c#
[STAThread]
[DllImport("C:\\Documents and Settings\\lab\\Escritorio\\dispatch\\prova\\debug\\prova.dll")]
public static extern int suma();
[DllImport("C:\\Documents and Settings\\lab\\Escritorio\\dispatch\\prova\\debug\\prova.dll")]
public static extern void setA(int a);
[DllImport("C:\\Documents and Settings\\lab\\Escritorio\\dispatch\\prova\\debug\\prova.dll")]
public static extern void setB(int b);
[DllImport("C:\\Documents and Settings\\lab\\Escritorio\\dispatch\\prova\\debug\\prova.dll")]
public static extern double multiplica();
[DllImport("C:\\Documents and Settings\\lab\\Escritorio\\dispatch\\prova\\debug\\prova.dll")]
public static extern int getA();
[DllImport("C:\\Documents and Settings\\lab\\Escritorio\\dispatch\\prova\\debug\\prova.dll")]
public static extern int getB();
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(suma().ToString());
setA(11);
setB(11);
MessageBox.Show(multiplica().ToString());
MessageBox.Show(getA().ToString());
MessageBox.Show(getB().ToString());
}