Hoe voer ik een C-programma uit als een thread vanuit een C # systeemvaktoepassing?

Ik heb een C-consoleapplicatie die vroeger op de voorgrond werd uitgevoerd in een CMD -terminal in Windows en invoer van gebruikersaanslagen nam. Het moet nu echter naar de achtergrond worden verplaatst en vereist geen invoer van de gebruiker.

Ik heb een systeemvak gemaakt, dat op de juiste manier is geïmplementeerd met een rechtermuisklik met de rechtermuisknop en met de rechtermuisknop klikken. En heb een terminalprogramma dat de functionaliteit doet.

In plaats van het programma opnieuw te herschrijven, wil ik graag een thread kunnen maken die de functies van mijn bestaande programma oproept waarvoor de terminal niet nodig is.

Gewoon om het punt te benadrukken dat de interactieve elementen van de console uit de code zijn verwijderd, evenals de reactie van applicaties op toetsaanslagen, enz. Hopelijk maakt dit de zaken enigszins duidelijk.

Question: Is this possible? And how would I be able to implement this?

(Ik ben over het algemeen geen pc-programmeur die meer ingesloten C gebruikt, dus .NET is mij vreemd, alle hulp wordt zeer op prijs gesteld)

2
niet genoeg details om te antwoorden .... maar het is mogelijk dat uw .NET-programma uw consoletoepassing op de achtergrond start.
toegevoegd de auteur Keith Nicholas, de bron
niet genoeg details om te antwoorden .... maar het is mogelijk dat uw .NET-programma uw consoletoepassing op de achtergrond start.
toegevoegd de auteur Keith Nicholas, de bron
niet genoeg details om te antwoorden .... maar het is mogelijk dat uw .NET-programma uw consoletoepassing op de achtergrond start.
toegevoegd de auteur Keith Nicholas, de bron
een tray-applicatie kan het proces starten
toegevoegd de auteur Keith Nicholas, de bron
een tray-applicatie kan het proces starten
toegevoegd de auteur Keith Nicholas, de bron
een tray-applicatie kan het proces starten
toegevoegd de auteur Keith Nicholas, de bron
@rodrigogq - Sorry man. Ik heb je misschien slecht advies gegeven. Het klonk gewoon, vanuit zijn vraag, dat hij functies van het C-programma wilde kunnen bellen. Als uw antwoord voor hem werkt, is het absoluut eenvoudiger en verdient u het antwoordtegoed. Ik heb je antwoord in elk geval verbeterd.
toegevoegd de auteur Icemanind, de bron
@ HarryJohnston - Hij zou het niet eens opnieuw moeten opbouwen als een DLL. U kunt nog steeds functies in een EXE-bestand exporteren. Maar het is logischer als een DLL
toegevoegd de auteur Icemanind, de bron
@ HarryJohnston - Hij zou het niet eens opnieuw moeten opbouwen als een DLL. U kunt nog steeds functies in een EXE-bestand exporteren. Maar het is logischer als een DLL
toegevoegd de auteur Icemanind, de bron
@ HarryJohnston - Hij zou het niet eens opnieuw moeten opbouwen als een DLL. U kunt nog steeds functies in een EXE-bestand exporteren. Maar het is logischer als een DLL
toegevoegd de auteur Icemanind, de bron
Ik denk dat om dit te doen, de functies in uw C-programma moeten worden geëxporteerd met behulp van iets als _declspec (dllexport)
toegevoegd de auteur Icemanind, de bron
Ik denk dat om dit te doen, de functies in uw C-programma moeten worden geëxporteerd met behulp van iets als _declspec (dllexport)
toegevoegd de auteur Icemanind, de bron
Ik denk dat om dit te doen, de functies in uw C-programma moeten worden geëxporteerd met behulp van iets als _declspec (dllexport)
toegevoegd de auteur Icemanind, de bron
@rodrigogq - Uit zijn vraag stelt hij: "Ik zou graag een thread willen maken die de functies van mijn bestaande programma oproept".
toegevoegd de auteur Icemanind, de bron
@rodrigogq - Sorry man. Ik heb je misschien slecht advies gegeven. Het klonk gewoon, vanuit zijn vraag, dat hij functies van het C-programma wilde kunnen bellen. Als uw antwoord voor hem werkt, is het absoluut eenvoudiger en verdient u het antwoordtegoed. Ik heb je antwoord in elk geval verbeterd.
toegevoegd de auteur Icemanind, de bron
@rodrigogq - Sorry man. Ik heb je misschien slecht advies gegeven. Het klonk gewoon, vanuit zijn vraag, dat hij functies van het C-programma wilde kunnen bellen. Als uw antwoord voor hem werkt, is het absoluut eenvoudiger en verdient u het antwoordtegoed. Ik heb je antwoord in elk geval verbeterd.
toegevoegd de auteur Icemanind, de bron
@rodrigogq - Uit zijn vraag stelt hij: "Ik zou graag een thread willen maken die de functies van mijn bestaande programma oproept".
toegevoegd de auteur Icemanind, de bron
@rodrigogq - Uit zijn vraag stelt hij: "Ik zou graag een thread willen maken die de functies van mijn bestaande programma oproept".
toegevoegd de auteur Icemanind, de bron
Yep, de beste manier om te gaan is bijna zeker om je C-programma opnieuw op te bouwen als een DLL die een of meer functies exporteert. Ik ben er vrij zeker van dat je willekeurige DLL's kunt aanroepen vanuit C#, hoewel ik niet bekend ben met de methode.
toegevoegd de auteur Harry Johnston, de bron
Yep, de beste manier om te gaan is bijna zeker om je C-programma opnieuw op te bouwen als een DLL die een of meer functies exporteert. Ik ben er vrij zeker van dat je willekeurige DLL's kunt aanroepen vanuit C#, hoewel ik niet bekend ben met de methode.
toegevoegd de auteur Harry Johnston, de bron
Yep, de beste manier om te gaan is bijna zeker om je C-programma opnieuw op te bouwen als een DLL die een of meer functies exporteert. Ik ben er vrij zeker van dat je willekeurige DLL's kunt aanroepen vanuit C#, hoewel ik niet bekend ben met de methode.
toegevoegd de auteur Harry Johnston, de bron
@rodrigogq Het lijkt erop dat ik zal herbouwen als een DLL. Rodrigogq, je zei dat ik misschien gewoon in staat zou zijn om het proces te starten en te beëindigen, hoe zou ik dit syntactisch kunnen doen, omdat dit voor mij de eenvoudigste optie lijkt? Of is dit geen goed idee?
toegevoegd de auteur Luke, de bron
@icemanind Hallo ik zal waarschijnlijk exporteren naar DLL. Er is echter een reden om niet alleen het proces te starten en te verlaten. Ik zei wel dat ik mijn functies wilde oproepen vanuit een thread, maar als het mogelijk is om de C-toepassing (zonder de terminal te openen) op de achtergrond start en deze afsluit met de systeemtoepassing, kan ik niet zien waarom ik dat zou doen niet op deze manier ... Bedankt
toegevoegd de auteur Luke, de bron
@icemanind Hallo ik zal waarschijnlijk exporteren naar DLL. Er is echter een reden om niet alleen het proces te starten en te verlaten. Ik zei wel dat ik mijn functies wilde oproepen vanuit een thread, maar als het mogelijk is om de C-toepassing (zonder de terminal te openen) op de achtergrond start en deze afsluit met de systeemtoepassing, kan ik niet zien waarom ik dat zou doen niet op deze manier ... Bedankt
toegevoegd de auteur Luke, de bron
@icemanind Hallo ik zal waarschijnlijk exporteren naar DLL. Er is echter een reden om niet alleen het proces te starten en te verlaten. Ik zei wel dat ik mijn functies wilde oproepen vanuit een thread, maar als het mogelijk is om de C-toepassing (zonder de terminal te openen) op de achtergrond start en deze afsluit met de systeemtoepassing, kan ik niet zien waarom ik dat zou doen niet op deze manier ... Bedankt
toegevoegd de auteur Luke, de bron
Laat zien wie er interesse in had: ik implementeerde zowel rodrigogq als icemanind oplossingen; -rodrigogq oplossing om Process.Start te gebruiken was ongelooflijk eenvoudig te implementeren (een nuttige gerelateerde link is stackoverflow.com/questions/3847330/… ) was echter beperkt voor wat betreft het correct afsluiten van het proces. -man-man-oplossing was moeilijker te implementeren, had voordelen op het gebied van controle (bijvoorbeeld nodig bij het schrijven naar een bestand) Ik heb in dit geval rodrigogq-oplossing gebruikt, maar er zijn absoluut vergelijkbare situaties waarbij het gebruik van DLL geschikter is
toegevoegd de auteur Luke, de bron
Laat zien wie er interesse in had: ik implementeerde zowel rodrigogq als icemanind oplossingen; -rodrigogq oplossing om Process.Start te gebruiken was ongelooflijk eenvoudig te implementeren (een nuttige gerelateerde link is stackoverflow.com/questions/3847330/… ) was echter beperkt voor wat betreft het correct afsluiten van het proces. -man-man-oplossing was moeilijker te implementeren, had voordelen op het gebied van controle (bijvoorbeeld nodig bij het schrijven naar een bestand) Ik heb in dit geval rodrigogq-oplossing gebruikt, maar er zijn absoluut vergelijkbare situaties waarbij het gebruik van DLL geschikter is
toegevoegd de auteur Luke, de bron
icemanind en rodrigogq hebben beiden goede antwoorden naar voren gebracht die erop lijken dat ze oplossingen voor mijn probleem zullen zijn. Ik zal op maandag updaten en zeggen welke optie ik heb gekozen en hoe gemakkelijk ze waren om te implementeren.
toegevoegd de auteur Luke, de bron
icemanind en rodrigogq hebben beiden goede antwoorden naar voren gebracht die erop lijken dat ze oplossingen voor mijn probleem zullen zijn. Ik zal op maandag updaten en zeggen welke optie ik heb gekozen en hoe gemakkelijk ze waren om te implementeren.
toegevoegd de auteur Luke, de bron
icemanind en rodrigogq hebben beiden goede antwoorden naar voren gebracht die erop lijken dat ze oplossingen voor mijn probleem zullen zijn. Ik zal op maandag updaten en zeggen welke optie ik heb gekozen en hoe gemakkelijk ze waren om te implementeren.
toegevoegd de auteur Luke, de bron
@rodrigogq Het lijkt erop dat ik zal herbouwen als een DLL. Rodrigogq, je zei dat ik misschien gewoon in staat zou zijn om het proces te starten en te beëindigen, hoe zou ik dit syntactisch kunnen doen, omdat dit voor mij de eenvoudigste optie lijkt? Of is dit geen goed idee?
toegevoegd de auteur Luke, de bron
@rodrigogq verwacht geen enkele vorm van gebruikersinvoer meer
toegevoegd de auteur Luke, de bron
@rodrigogq verwacht geen enkele vorm van gebruikersinvoer meer
toegevoegd de auteur Luke, de bron
@rodrigogq verwacht geen enkele vorm van gebruikersinvoer meer
toegevoegd de auteur Luke, de bron
Laat me het herformuleren om meer duidelijk te zijn. Excuses.
toegevoegd de auteur Luke, de bron
Laat me het herformuleren om meer duidelijk te zijn. Excuses.
toegevoegd de auteur Luke, de bron
Een C-programma is veel te vaag. Ik vermoed dat je bedoelt een consoletoepassing geschreven in C , in welk geval het antwoord nee is, kan een consoletoepassing niet worden uitgevoerd als een bladapplicatie zonder aanpassingen; het zou op zijn minst een vensterhandvat en een berichtlijn moeten hebben om berichten te ontvangen, die console-toepassingen niet hebben.
toegevoegd de auteur Ken White, de bron
Een C-programma is veel te vaag. Ik vermoed dat je bedoelt een consoletoepassing geschreven in C , in welk geval het antwoord nee is, kan een consoletoepassing niet worden uitgevoerd als een bladapplicatie zonder aanpassingen; het zou op zijn minst een vensterhandvat en een berichtlijn moeten hebben om berichten te ontvangen, die console-toepassingen niet hebben.
toegevoegd de auteur Ken White, de bron
@Keith: dat is echter geen tray-applicatie, wat de vraag is.
toegevoegd de auteur Ken White, de bron
@Keith: dat is echter geen tray-applicatie, wat de vraag is.
toegevoegd de auteur Ken White, de bron
@Keith: dat is echter geen tray-applicatie, wat de vraag is.
toegevoegd de auteur Ken White, de bron
Als hij gewoon wil beginnen en het proces wil verlaten, zie ik niet in waarom hij zo ver moet gaan .. Gewoon starten ... en afsluiten als de gebruiker vraagt ​​om af te sluiten. Mis ik hier iets? Het vakje over zou niet moeten vragen naar een terminalversie of iets dergelijks. Het zijn gescheiden spullen.
toegevoegd de auteur rodrigogq, de bron
Luke, verwacht je C-programma een koning van de toetsaanslag, gebruikersinput?
toegevoegd de auteur rodrigogq, de bron
Luke, verwacht je C-programma een koning van de toetsaanslag, gebruikersinput?
toegevoegd de auteur rodrigogq, de bron
Als hij gewoon wil beginnen en het proces wil verlaten, zie ik niet in waarom hij zo ver moet gaan .. Gewoon starten ... en afsluiten als de gebruiker vraagt ​​om af te sluiten. Mis ik hier iets? Het vakje over zou niet moeten vragen naar een terminalversie of iets dergelijks. Het zijn gescheiden spullen.
toegevoegd de auteur rodrigogq, de bron
Als hij gewoon wil beginnen en het proces wil verlaten, zie ik niet in waarom hij zo ver moet gaan .. Gewoon starten ... en afsluiten als de gebruiker vraagt ​​om af te sluiten. Mis ik hier iets? Het vakje over zou niet moeten vragen naar een terminalversie of iets dergelijks. Het zijn gescheiden spullen.
toegevoegd de auteur rodrigogq, de bron
@icemanind maakt nooit uit! Ik heb ook van je code gehoord! :)
toegevoegd de auteur rodrigogq, de bron
@icemanind bedankt. Toen heb ik mijn antwoord verwijderd. Hoe dan ook, exporteren is een goede optie.
toegevoegd de auteur rodrigogq, de bron
@icemanind bedankt. Toen heb ik mijn antwoord verwijderd. Hoe dan ook, exporteren is een goede optie.
toegevoegd de auteur rodrigogq, de bron
@Luke Ik heb mijn antwoord voor referentie ongedaan gemaakt. Als je niets belt, probeer dan gewoon.
toegevoegd de auteur rodrigogq, de bron
@Luke Ik heb mijn antwoord voor referentie ongedaan gemaakt. Als je niets belt, probeer dan gewoon.
toegevoegd de auteur rodrigogq, de bron
@Luke Ik heb mijn antwoord voor referentie ongedaan gemaakt. Als je niets belt, probeer dan gewoon.
toegevoegd de auteur rodrigogq, de bron
@icemanind maakt nooit uit! Ik heb ook van je code gehoord! :)
toegevoegd de auteur rodrigogq, de bron
@icemanind maakt nooit uit! Ik heb ook van je code gehoord! :)
toegevoegd de auteur rodrigogq, de bron

7 antwoord

Ik weet niet zeker of dit is wat u vraagt, maar als u vraagt ​​of u vanuit een C# -toepassing functies van uw C-programma kunt aanroepen, dan kunt u dat doen. Zolang u de broncode van uw C-programma hebt. Om functies in C beschikbaar te maken voor een C# -programma, moeten ze worden geëxporteerd. Ik zal je een voorbeeld laten zien:

MyAddDll.h

#include 

extern "C"
{
    __declspec(dllexport) int Add(int a, int b);
}

Wat hier van belang is, is dat uw functie is ingepakt in een blok extern "C" . In feite vertelt dit de compiler om de naam van uw functie niet te verpulveren. Het andere belangrijke stuk is __ declspec (dllexport) . Dit vertelt de compiler dat u deze functie wilt exporteren, zodat deze kan worden aangeroepen vanuit een ander programma (zoals uw C# -programma).

MyAddDll.cpp

#include 
#include "MyAddDll.h"

extern "C"
{
    __declspec(dllexport) int Add(int a, int b)
    {
        return (a + b);
    }
}

Nogmaals, je code wordt ingepakt in een extern "C" blok en je moet __ declspec (dllexport) aan de functie toevoegen. Nu kunt u dit in een DLL-bestand of een EXE-bestand compileren. Nu om het vanuit C# te noemen, het is vrij rechttoe rechtaan:

MyProgram.cs

class Program
{
    [DllImport("c:\\PathToMyDllOrExeFile\\MyAddDll.dll")]
    public static extern int Add(int val1, int val2);

    static void Main(string[] args)
    {
        int val1 = 12;
        int val2 = 4;
        Console.WriteLine("{0} + {1} = {2}", val1, val2, Add(val1, val2));
    }
}

Dat is alles wat er is!

Eén "gotcha" is echter dat je C-programma en je C# -programma zowel als 32-bit of 64-bit gecompileerd zijn. U kunt uw C-programma niet als 64-bit en uw C# -programma als 32-bit compileren. Ze moeten allebei dezelfde bitlengte gebruiken.

4
toegevoegd
@Luke - C-bestanden die functies bevatten die u in C# wilt kunnen gebruiken, moeten worden ingepakt
toegevoegd de auteur Icemanind, de bron
@Luke - Nog iets. Ik nam de aanname dat je C-programma was gecompileerd met Visual Studio van Microsoft. Als dit niet correct is, laat het me weten en ik zal mijn antwoord bijwerken. __ declspec (dllexport) bestaat alleen in de compiler van Microsoft. Voor elke andere compiler zouden we een export.def-bestand moeten maken.
toegevoegd de auteur Icemanind, de bron
Hallo bedankt, dat is erg behulpzaam. Als ik meerdere C-bestanden heb, moeten ze allemaal in het DLL-bestand worden gewikkeld of als ik de hoofdrol verpak als een DLL, kan dit de andere C-bestanden dan noemen?
toegevoegd de auteur Luke, de bron
Dank je. Dit zou nuttig moeten zijn bij het implementeren van de verandering. Proost
toegevoegd de auteur Luke, de bron
Ik gebruik de nieuwste gratis versie van Microsoft Visual Studio.
toegevoegd de auteur Luke, de bron

Zoals al is gepost, zou u de Process.Start kunnen gebruiken in uw C# -appendix.

   //Uses the ProcessStartInfo class to start new processes, 
   //both in a minimized mode. 
    void OpenWithStartInfo()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
        startInfo.WindowStyle = ProcessWindowStyle.Minimized;

        Process.Start(startInfo);

        startInfo.Arguments = "www.northwindtraders.com";

        Process.Start(startInfo);
    }

http://msdn.microsoft.com/en- ons/library/53ezey2s (v = vs.110) Aspx

You could try launching it on a hidden state: http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110).aspx

Sommige programmeurs zeggen voorzichtig te zijn. Als er input wordt verwacht, kan uw proces waarschijnlijk stoppen. zorg ervoor dat niets echt stopt uw programma.

Je zou ook kunnen proberen om een ​​ cmd commando met Process.Start te starten, maar ik zou zeggen dat het gewoon te veel is. Dit zou een ander proces starten zonder uw C# tray applicatie controle:

 Process.Start("start /min cmd /c mycommand");
3
toegevoegd
Ik ben er niet 100% zeker van dat hij zijn executable wil bellen. Ik denk dat hij misschien een specifieke functie of specifieke functies wil noemen die is gecompileerd in zijn uitvoerbare bestand.
toegevoegd de auteur Icemanind, de bron
@rodrigogq Ik denk dat een betere oplossing voor mijn probleem het creëren van een thread is die DLL-functies aanroept. Hoewel je antwoord ik misschien kan gebruiken voor een iets andere applicatie, moet ik ook automatiseren. Proost
toegevoegd de auteur Luke, de bron

Zoals al is gepost, zou u de Process.Start kunnen gebruiken in uw C# -appendix.

   //Uses the ProcessStartInfo class to start new processes, 
   //both in a minimized mode. 
    void OpenWithStartInfo()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
        startInfo.WindowStyle = ProcessWindowStyle.Minimized;

        Process.Start(startInfo);

        startInfo.Arguments = "www.northwindtraders.com";

        Process.Start(startInfo);
    }

http://msdn.microsoft.com/en- ons/library/53ezey2s (v = vs.110) Aspx

You could try launching it on a hidden state: http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110).aspx

Sommige programmeurs zeggen voorzichtig te zijn. Als er input wordt verwacht, kan uw proces waarschijnlijk stoppen. zorg ervoor dat niets echt stopt uw programma.

Je zou ook kunnen proberen om een ​​ cmd commando met Process.Start te starten, maar ik zou zeggen dat het gewoon te veel is. Dit zou een ander proces starten zonder uw C# tray applicatie controle:

 Process.Start("start /min cmd /c mycommand");
3
toegevoegd
Ik ben er niet 100% zeker van dat hij zijn executable wil bellen. Ik denk dat hij misschien een specifieke functie of specifieke functies wil noemen die is gecompileerd in zijn uitvoerbare bestand.
toegevoegd de auteur Icemanind, de bron
@rodrigogq Ik denk dat een betere oplossing voor mijn probleem het creëren van een thread is die DLL-functies aanroept. Hoewel je antwoord ik misschien kan gebruiken voor een iets andere applicatie, moet ik ook automatiseren. Proost
toegevoegd de auteur Luke, de bron

Zoals al is gepost, zou u de Process.Start kunnen gebruiken in uw C# -appendix.

   //Uses the ProcessStartInfo class to start new processes, 
   //both in a minimized mode. 
    void OpenWithStartInfo()
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
        startInfo.WindowStyle = ProcessWindowStyle.Minimized;

        Process.Start(startInfo);

        startInfo.Arguments = "www.northwindtraders.com";

        Process.Start(startInfo);
    }

http://msdn.microsoft.com/en- ons/library/53ezey2s (v = vs.110) Aspx

You could try launching it on a hidden state: http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110).aspx

Sommige programmeurs zeggen voorzichtig te zijn. Als er input wordt verwacht, kan uw proces waarschijnlijk stoppen. zorg ervoor dat niets echt stopt uw programma.

Je zou ook kunnen proberen om een ​​ cmd commando met Process.Start te starten, maar ik zou zeggen dat het gewoon te veel is. Dit zou een ander proces starten zonder uw C# tray applicatie controle:

 Process.Start("start /min cmd /c mycommand");
3
toegevoegd
Ik ben er niet 100% zeker van dat hij zijn executable wil bellen. Ik denk dat hij misschien een specifieke functie of specifieke functies wil noemen die is gecompileerd in zijn uitvoerbare bestand.
toegevoegd de auteur Icemanind, de bron
@rodrigogq Ik denk dat een betere oplossing voor mijn probleem het creëren van een thread is die DLL-functies aanroept. Hoewel je antwoord ik misschien kan gebruiken voor een iets andere applicatie, moet ik ook automatiseren. Proost
toegevoegd de auteur Luke, de bron

U kunt uw C-programma starten vanuit .NET-code via System.Diagnostics.Process. Het zal in een afzonderlijk proces worden uitgevoerd.

U kunt het proces ook uit .NET-code verwijderen

1
toegevoegd
De vraag vraagt ​​naar een systeemvak-toepassing , wat niet hetzelfde is als een consoletoepassing die wordt gestart via Verwerken .
toegevoegd de auteur Ken White, de bron

U kunt uw C-programma starten vanuit .NET-code via System.Diagnostics.Process. Het zal in een afzonderlijk proces worden uitgevoerd.

U kunt het proces ook uit .NET-code verwijderen

1
toegevoegd
De vraag vraagt ​​naar een systeemvak-toepassing , wat niet hetzelfde is als een consoletoepassing die wordt gestart via Verwerken .
toegevoegd de auteur Ken White, de bron

U kunt uw C-programma starten vanuit .NET-code via System.Diagnostics.Process. Het zal in een afzonderlijk proces worden uitgevoerd.

U kunt het proces ook uit .NET-code verwijderen

1
toegevoegd
De vraag vraagt ​​naar een systeemvak-toepassing , wat niet hetzelfde is als een consoletoepassing die wordt gestart via Verwerken .
toegevoegd de auteur Ken White, de bron