propiedad - Cómo crear una DLL que se usará en C#
propiedad static c# (2)
Hay dos problemas que tienes:
Necesitas construir el dll, no intentarlo y depurarlo. Si está en el mismo proyecto que su proyecto C #, configure el proyecto C # como proyecto de inicio (haga clic derecho en el archivo del proyecto), de lo contrario solo tendrá que seleccionar Crear en lugar de Iniciar la depuración (si usa el acceso directo) estas teclas probablemente serán Ctrl + Shift + B [si usa la configuración del entorno C #] o F7 [si está usando la configuración del entorno C ++]).
Debe tener la DLL en la ubicación correcta. Si desea automatizar esto, solo agregue un paso posterior a la compilación al proyecto C ++ (propiedades del proyecto, acciones de compilación si recuerdo correctamente y compilación posterior) que hace algo como
copy "$(TargetPath)" "$(SolutionDir)/CsProj/bin/$(ConfigurationName)/*.*"
Algunas de esas macros pueden estar un poco mal, pero debes tener una idea general.
EDITAR: También debe asegurarse de que su proyecto C ++ se esté desarrollando antes de su proyecto C #. Haga clic derecho en su archivo de proyecto C #, y vaya a Dependencias del proyecto, luego marque la biblioteca C ++ en el cuadro Depende de. Para asegurarse de que su paso posterior a la compilación funciona, intente construir solo el proyecto C ++ y, al verificarlo, copie la DLL en el directorio correcto en su proyecto C #. Marcará los errores en la ventana de salida si no lo hace. Si siguió ese tutorial para crear una DLL, debería estar bien.
Tengo una placa ICOP VDX-6354 con Win CE. Estoy tratando de controlar el zumbador del tablero desde mi programa C #. Probé todo el playsound, etc. invoca la plataforma "coredll.dll". ninguno de ellos funcionó tan lejos. Entonces mi última oportunidad es crear mi propia DLL.
unsigned char inp(short addr)
{
unsigned char cValue;
_asm
{
mov dx, addr
in ax, dx
mov cValue, al
}
return cValue;
}
void outp(int addr, unsigned char val)
{
__asm
{
push edx
mov edx, DWORD PTR addr
mov al, BYTE PTR val
out dx, al
pop edx
}
}
bool MyBeep(DWORD dwFreq, DWORD dwDuration)
{
outp(0x43, 0xb6); // Set Buzzer
outp(0x42, (0x1234dc / dwFreq)); // Frequency LSB
outp(0x42, (0x1234dc / dwFreq) >> 8); // Frequency MSB
outp(0x61, inp(0x61) | 0x3); // Start beep
Sleep(dwDuration);
outp(0x61, inp(0x61) & 0xfc); // End beep
return TRUE;
}
El código anterior está disponible en la hoja de datos de la placa. Quiero compilarlo como una DLL y luego invocarlo en mi programa C # como
[DllImport("Buzzer.dll", EntryPoint = "MyBeep")]
public static extern void MyBeep(uint dwFreq, uint dwDuration);
Usé un prefijo de la siguiente manera cuando compilé:
extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration)
Entonces, con suerte, podría controlar el timbre. Mi problema es que no podría ser exitoso compilarlo. Seguí los pasos aquí, pero no me ayudó.
¿Qué debo hacer paso a paso?
EDITAR:
Creo que construí el DLL. Intenté otra forma de construir el archivo DLL que se encuentra aquí .
Ahora, copié el archivo DLL a la carpeta de depuración de mi proyecto de inicio C # (otras DLL del proyecto también están en esta carpeta). Luego intento invocar la función MyBeep desde MyBeep.DLL en mi proyecto C # por:
[DllImport("MyBeep.dll", EntryPoint = "MyBeep")]
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration);
Pero da la siguiente excepción.
No se puede encontrar la DLL de PInvoke ''MyBeep.dll''.
¿Me estoy perdiendo de algo? Por favor, compruebe los enlaces anteriores que hice trampa para construir el archivo DLL para comprender lo que hice hasta ahora. Saludos.
Aunque el mensaje de error sugiere lo contrario, debe verificar el nombre de la función exportada. Para Win32 siempre uso esta herramienta . Para un dll de CE, tal vez DUMPBIN / EXPORTS funcione.
El nombre de functon se llamará __MyBeep
: creo que este prefijo es una convención de C.