C sharp - Crear libreria dll en C# y usarlo en un proyecto C

 
Vista:
sin imagen de perfil
Val: 5
Ha disminuido su posición en 14 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Crear libreria dll en C# y usarlo en un proyecto C

Publicado por cesar (2 intervenciones) el 25/07/2018 16:14:53
Saludos...les comento que estoy realizando un proyecto en LabWindows/CVI 2012 el cual es un entorno de desarrollo ANSI C, en donde hace un par de dias he estado intentando ejecutar lineas de comandos en windows para poder grabar el bootloader en un ATMEGA328P, y me sugirieron hacer uso de la funcion system() o LaunchExecutableEx() pero en ninguna de las dos logro obtener el resultado que devuelve al ejecutar las lineas de comandos (avrdude -v -patmega328p -cstk500v1 -PCOM7 -b19200 -Uflash:w:C:\ATmegaBOOT_168_atmega328.hex:i -Ulock:w:0x0F:m), asi que lo intente en C# y les comento que he logrado obtener el resultado que deseo. Ahora lo que quisiera hacer es una libreria dll para poder usarlo en mi proyecto C, pero mi problema es que no logro encontrar buena informacion. Alguien que pueda ayudarme con este problema por favor, gracias de antemano (Dejo adjunto el codigo en C# para grabar el bootloader en el ATMEGA328P).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
System.Diagnostics.ProcessStartInfo procStartInfo = new
System.Diagnostics.ProcessStartInfo("cmd", "/c" + "avrdude -v - patmega328p -cstk500v1 -PCOM7 -b19200 -Uflash:w:C:/ATmegaBOOT_168_atmega328.hex:i -Ulock:w:0x0F:m");
procStartInfo.RedirectStandardOutput = true;
procStartInfo.UseShellExecute = false;
procStartInfo.CreateNoWindow = true;
procStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo = procStartInfo;
proc.Start();
string result = proc.StandardOutput.ReadToEnd();
string successfulResult = "avrdude: safemode: lfuse reads as FF\n" +
                          "avrdude: safemode: hfuse reads as DA\n" +
                          "avrdude: safemode: efuse reads as 5\n" +
                          "avrdude: safemode: lfuse reads as FF\n" +
                          "avrdude: safemode: hfuse reads as DA\n" +
                          "avrdude: safemode: efuse reads as 5\n";
if (String.Compare(result, successfulResult) > 0)
{
    Console.WriteLine("Bootloader Loaded");
}
else
{
    Console.WriteLine("Error loading bootloader");
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 5
Ha disminuido su posición en 14 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Crear libreria dll en C# y usarlo en un proyecto C

Publicado por cesar (2 intervenciones) el 25/07/2018 21:25:47
Luego de darle vueltas a mi problema pude encontrar una solucion, el cual consiste tratar la clase de C# como un objeto COM: En las propiedades del proyecto de C# se marca la casilla de "Register for COM Interop", se ponen en el código fuente los atributos requeridos (y se quita el ComVisible(false) del AssemblyInfo.cs), se compila, y se registra en Windows como si fuera un componente COM. Y después desde C se usan las APIs de Windows para llamar al objeto COM. El resultado es que internamente no estás llamando a la DLL de .NET, sino que estás llamando al RCW (Runtime Callable Wrapper) que es un envoltorio que se genera al marcar el Register For COM Interop y que acepta las llamadas externas de tipo COM, trasvasándolas a la DLL de .NET. En el sigueiente enlace es donde pude encontrar muy buena informacion acerca del tema. https://www.codeproject.com/Articles/12673/Calling-Managed-NET-C-COM-Objects-from-Unmanaged-C
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar