Як запустити програму C як потік з C # System Tray Application?

У мене є консольне додаток C, яке використовувалося для запуску на передньому плані в терміналі CMD у Windows і вводило вхідні дані користувача. Однак тепер його потрібно перенести на фон і не потрібно вводити користувача.

Я створив системний трей, який правильно реалізований з правою кнопкою миші і правою кнопкою миші. І є термінальна програма, яка виконує функціональність.

Замість того, щоб знову переписувати програму, мені хотілося б створити потік, який викликає функції з моєї існуючої програми, які не вимагають терміналу.

Тільки щоб підкреслити, що консольні інтерактивні аспекти були вилучені з коду, як у відповідь програми на натискання клавіш і т.д.

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

(Я взагалі не програміст на ПК, використовуючи більше вбудованих C так. NET є досить іноземним для мене. Будь-яка допомога з вдячністю)

2
не достатньо деталей, щоб відповісти .... але для вашої програми .NET можна запустити консольне додаток у фоновому режимі.
додано Автор Keith Nicholas, джерело
не достатньо деталей, щоб відповісти .... але для вашої програми .NET можна запустити консольне додаток у фоновому режимі.
додано Автор Keith Nicholas, джерело
не достатньо деталей, щоб відповісти .... але для вашої програми .NET можна запустити консольне додаток у фоновому режимі.
додано Автор Keith Nicholas, джерело
додаток лотка може запустити процес
додано Автор Keith Nicholas, джерело
додаток лотка може запустити процес
додано Автор Keith Nicholas, джерело
додаток лотка може запустити процес
додано Автор Keith Nicholas, джерело
@rodrigogq - Вибачте, людина. Я міг би дати вам погані поради. Він просто звучав, з його питання, що він хотів мати можливість викликати функції з програми С. Якщо ваша відповідь працює для нього, його, безумовно, простіше, і ви заслуговуєте на відповідь. У всякому разі, я проголосив вашу відповідь.
додано Автор Icemanind, джерело
@HarryJohnston - Він навіть не хотів би його відновлювати як DLL. Ви все ще можете експортувати функції у файлі EXE. Але це більше сенсу як DLL
додано Автор Icemanind, джерело
@HarryJohnston - Він навіть не хотів би його відновлювати як DLL. Ви все ще можете експортувати функції у файлі EXE. Але це більше сенсу як DLL
додано Автор Icemanind, джерело
@HarryJohnston - Він навіть не хотів би його відновлювати як DLL. Ви все ще можете експортувати функції у файлі EXE. Але це більше сенсу як DLL
додано Автор Icemanind, джерело
Думаю, для цього функції у вашій програмі C потрібно експортувати, використовуючи щось на зразок _declspec (dllexport)
додано Автор Icemanind, джерело
Думаю, для цього функції у вашій програмі C потрібно експортувати, використовуючи щось на зразок _declspec (dllexport)
додано Автор Icemanind, джерело
Думаю, для цього функції у вашій програмі C потрібно експортувати, використовуючи щось на зразок _declspec (dllexport)
додано Автор Icemanind, джерело
@rodrigogq - З його питання він стверджує: "Я хотів би мати можливість створити потік, який викликає функції з моєї існуючої програми".
додано Автор Icemanind, джерело
@rodrigogq - Вибачте, людина. Я міг би дати вам погані поради. Він просто звучав, з його питання, що він хотів мати можливість викликати функції з програми С. Якщо ваша відповідь працює для нього, його, безумовно, простіше, і ви заслуговуєте на відповідь. У всякому разі, я проголосив вашу відповідь.
додано Автор Icemanind, джерело
@rodrigogq - Вибачте, людина. Я міг би дати вам погані поради. Він просто звучав, з його питання, що він хотів мати можливість викликати функції з програми С. Якщо ваша відповідь працює для нього, його, безумовно, простіше, і ви заслуговуєте на відповідь. У всякому разі, я проголосив вашу відповідь.
додано Автор Icemanind, джерело
@rodrigogq - З його питання він стверджує: "Я хотів би мати можливість створити потік, який викликає функції з моєї існуючої програми".
додано Автор Icemanind, джерело
@rodrigogq - З його питання він стверджує: "Я хотів би мати можливість створити потік, який викликає функції з моєї існуючої програми".
додано Автор Icemanind, джерело
Так, найкращим способом піти майже напевно є відновлення програми C як DLL, яка експортує одну або більше функцій. Я впевнений, що ви можете викликати довільні DLL з C#, хоча я не знайомий з цим методом.
додано Автор Harry Johnston, джерело
Так, найкращим способом піти майже напевно є відновлення програми C як DLL, яка експортує одну або більше функцій. Я впевнений, що ви можете викликати довільні DLL з C#, хоча я не знайомий з цим методом.
додано Автор Harry Johnston, джерело
Так, найкращим способом піти майже напевно є відновлення програми C як DLL, яка експортує одну або більше функцій. Я впевнений, що ви можете викликати довільні DLL з C#, хоча я не знайомий з цим методом.
додано Автор Harry Johnston, джерело
@rodrigogq Здається, я буду переробляти як DLL. Родрігог ви згадали, що я можу просто запустити і вийти з процесу, як би я синтаксично зміг зробити це, як це звучить мені як найпростіший варіант? Чи це не дуже гарна ідея?
додано Автор Luke, джерело
@icemanind Привіт Я, ймовірно, експортувати в DLL. Але чи є підстава не просто розпочати і вийти з процесу. Я сказав, що я шукав, щоб викликати мої функції з потоку, однак, якщо можна просто запустити програму C (без відкриття терміналу) у фоновому режимі, і закрити його з системним додатком я не бачу, чому я б Зроби це так ... Дякую
додано Автор Luke, джерело
@icemanind Привіт Я, ймовірно, експортувати в DLL. Але чи є підстава не просто розпочати і вийти з процесу. Я сказав, що я шукав, щоб викликати мої функції з потоку, однак, якщо можна просто запустити програму C (без відкриття терміналу) у фоновому режимі, і закрити його з системним додатком я не бачу, чому я б Зроби це так ... Дякую
додано Автор Luke, джерело
@icemanind Привіт Я, ймовірно, експортувати в DLL. Але чи є підстава не просто розпочати і вийти з процесу. Я сказав, що я шукав, щоб викликати мої функції з потоку, однак, якщо можна просто запустити програму C (без відкриття терміналу) у фоновому режимі, і закрити його з системним додатком я не бачу, чому я б Зроби це так ... Дякую
додано Автор Luke, джерело
Включіть будь-кого, хто зацікавився: я реалізував обидва рішення rodrigogq і icemanind; -rodrigogq для використання Process.Start було неймовірно простим у впровадженні (корисною посиланням є stackoverflow.com/questions/3847330/… ) -був обмежений, коли мова йде про закриття процесу правильно. -imemanind рішення було важче реалізувати, мали переваги з точки зору контролю (наприклад, необхідне, якщо записування в файл) я використовував rodrigogq рішення в цьому випадку, але є, безумовно, подібні ситуації з використанням DLL є більш підходящим
додано Автор Luke, джерело
Включіть будь-кого, хто зацікавився: я реалізував обидва рішення rodrigogq і icemanind; -rodrigogq для використання Process.Start було неймовірно простим у впровадженні (корисною посиланням є stackoverflow.com/questions/3847330/… ) -був обмежений, коли мова йде про закриття процесу правильно. -imemanind рішення було важче реалізувати, мали переваги з точки зору контролю (наприклад, необхідне, якщо записування в файл) я використовував rodrigogq рішення в цьому випадку, але є, безумовно, подібні ситуації з використанням DLL є більш підходящим
додано Автор Luke, джерело
icemanind і rodrigogq мають обидва висунуті хороші відповіді, які з'являться вони будуть рішеннями моєї проблеми. Я буду оновлювати в понеділок і сказати, який варіант я пішов з і як легко вони повинні були реалізувати.
додано Автор Luke, джерело
icemanind і rodrigogq мають обидва висунуті хороші відповіді, які з'являться вони будуть рішеннями моєї проблеми. Я буду оновлювати в понеділок і сказати, який варіант я пішов з і як легко вони повинні були реалізувати.
додано Автор Luke, джерело
icemanind і rodrigogq мають обидва висунуті хороші відповіді, які з'являться вони будуть рішеннями моєї проблеми. Я буду оновлювати в понеділок і сказати, який варіант я пішов з і як легко вони повинні були реалізувати.
додано Автор Luke, джерело
@rodrigogq Здається, я буду переробляти як DLL. Родрігог ви згадали, що я можу просто запустити і вийти з процесу, як би я синтаксично зміг зробити це, як це звучить мені як найпростіший варіант? Чи це не дуже гарна ідея?
додано Автор Luke, джерело
@rodrigogq більше не очікує будь-якого входу користувача
додано Автор Luke, джерело
@rodrigogq більше не очікує будь-якого входу користувача
додано Автор Luke, джерело
@rodrigogq більше не очікує будь-якого входу користувача
додано Автор Luke, джерело
Дозвольте мені змінити його, щоб бути більш зрозумілим. Вибачення.
додано Автор Luke, джерело
Дозвольте мені змінити його, щоб бути більш зрозумілим. Вибачення.
додано Автор Luke, джерело
Програма C занадто розпливчаста. Я припускаю, що ви маєте на увазі консольну програму, написану на мові C , у цьому випадку відповідь немає , консольну програму не можна запускати як додаток без змін; воно повинно мати принаймні ручку вікна і цикл повідомлень, щоб отримувати сповіщення, які консольні програми не мають.
додано Автор Ken White, джерело
Програма C занадто розпливчаста. Я припускаю, що ви маєте на увазі консольну програму, написану на мові C , у цьому випадку відповідь немає , консольну програму не можна запускати як додаток без змін; воно повинно мати принаймні ручку вікна і цикл повідомлень, щоб отримувати сповіщення, які консольні програми не мають.
додано Автор Ken White, джерело
@Keith: Це не додаток для лотків, але це запитання.
додано Автор Ken White, джерело
@Keith: Це не додаток для лотків, але це запитання.
додано Автор Ken White, джерело
@Keith: Це не додаток для лотків, але це запитання.
додано Автор Ken White, джерело
Якщо він хоче просто почати і вийти з процесу, я не розумію, чому він повинен йти так далеко .. Просто почати .. і вийти, коли користувач просить вийти. Я тут щось відсутній? Про коробку не потрібно буде запитувати версію терміналу або щось подібне. Вони відокремлені.
додано Автор rodrigogq, джерело
Лука, чи ваша програма С очікує будь-якого короля клавіш, введення користувачем?
додано Автор rodrigogq, джерело
Лука, чи ваша програма С очікує будь-якого короля клавіш, введення користувачем?
додано Автор rodrigogq, джерело
Якщо він хоче просто почати і вийти з процесу, я не розумію, чому він повинен йти так далеко .. Просто почати .. і вийти, коли користувач просить вийти. Я тут щось відсутній? Про коробку не потрібно буде запитувати версію терміналу або щось подібне. Вони відокремлені.
додано Автор rodrigogq, джерело
Якщо він хоче просто почати і вийти з процесу, я не розумію, чому він повинен йти так далеко .. Просто почати .. і вийти, коли користувач просить вийти. Я тут щось відсутній? Про коробку не потрібно буде запитувати версію терміналу або щось подібне. Вони відокремлені.
додано Автор rodrigogq, джерело
@icemanind не пам'ятайте! Я також дізнався з вашого коду! :)
додано Автор rodrigogq, джерело
@icemanind спасибі. Потім я зняв свою відповідь. У будь-якому випадку, експорт є гарним варіантом.
додано Автор rodrigogq, джерело
@icemanind спасибі. Потім я зняв свою відповідь. У будь-якому випадку, експорт є гарним варіантом.
додано Автор rodrigogq, джерело
@Luke Я скасував свою відповідь. Якщо ви нічого не називаєте, просто запустіть, спробуйте це.
додано Автор rodrigogq, джерело
@Luke Я скасував свою відповідь. Якщо ви нічого не називаєте, просто запустіть, спробуйте це.
додано Автор rodrigogq, джерело
@Luke Я скасував свою відповідь. Якщо ви нічого не називаєте, просто запустіть, спробуйте це.
додано Автор rodrigogq, джерело
@icemanind не пам'ятайте! Я також дізнався з вашого коду! :)
додано Автор rodrigogq, джерело
@icemanind не пам'ятайте! Я також дізнався з вашого коду! :)
додано Автор rodrigogq, джерело

7 Відповіді

Я не впевнений, що це те, що ви просите, але якщо ви запитаєте, чи можете ви викликати функції з вашої програми з програми C#, то ви можете. Поки ви маєте вихідний код програми C. Для того, щоб функції в C були доступні для програми C#, вони повинні бути експортовані. Я покажу вам приклад:

MyAddDll.h

#include 

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

Тут важливо, щоб ваша функція була загорнута в блок extern "C" . В основному це дає змогу компілятору не перетворювати назву вашої функції. Іншим важливим елементом є __declspec (dllexport) . Це повідомляє компілятору, що ви хочете експортувати цю функцію, щоб її можна було викликати з іншої програми (наприклад, у вашій програмі C #).

MyAddDll.cpp

#include 
#include "MyAddDll.h"

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

Знову ж таки, ваш код переходить у блок extern "C" і вам потрібно додати до функції __declspec (dllexport) . Тепер ви можете скомпілювати це або у файл DLL або у файл EXE. Тепер, щоб викликати його з C#, його досить прямо:

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));
    }
}

Це все, що є!

Один "gotcha" хоч і переконайтеся, що ваша програма C і ваша програма C# компілюються як 32-бітні або 64-розрядні. Ви не можете скомпілювати вашу програму C як 64-бітну, а програму C# - як 32-бітну. Вони повинні використовувати однакову довжину біта.

4
додано
@Luke - Будь-які файли C, які містять функції, які ви хочете викликати в C#, повинні бути обгорнуті
додано Автор Icemanind, джерело
@Luke - Ще одна річ. Я зробив припущення, що ваша програма C була зібрана за допомогою Visual Studio від Microsoft. Якщо це не правильно, дайте мені знати, і я оновлю відповідь. __declspec (dllexport) існує лише в компіляторі Microsoft. Для будь-якого іншого компілятора нам потрібно створити файл export.def.
додано Автор Icemanind, джерело
Привіт спасибі, що це дуже корисно. Якщо у мене є кілька файлів C, вони всі повинні бути загорнуті в DLL, або якщо я обернути головний як DLL може викликати інші файли C?
додано Автор Luke, джерело
Дякую. Це має бути корисним у здійсненні змін. Привітання
додано Автор Luke, джерело
Я використовую останню безкоштовну версію Microsoft Visual Studio.
додано Автор Luke, джерело

Як вже було опубліковано, можна скористатися Process.Start з лотка програми C #.

   //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/ua- us/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

Деякі програмісти намагаються бути обережними. Якщо будь-який вхід очікується, то, можливо, ваш процес може зупинитися. переконайтеся, що нічого дійсно не припиняє ваша програма.

Ви також можете спробувати запустити команду cmd з Process.Start , але я б сказав, що це занадто багато. Це призведе до запуску іншого процесу без керування додатком до C #:

 Process.Start("start /min cmd /c mycommand");
3
додано
Я не на 100% впевнений, що він хоче назвати свій виконуваний файл. Я думаю, що він може захотіти назвати певну функцію або певні функції, які компілюються у його виконуваний файл.
додано Автор Icemanind, джерело
@rodrigogq Я думаю, краще рішення для моєї проблеми полягає у створенні потоку, який викликає функції DLL. Хоча ваша відповідь я міг би використовувати для трохи іншої програми, я теж потребую автоматизації. Привітання
додано Автор Luke, джерело

Як вже було опубліковано, можна скористатися Process.Start з лотка програми C #.

   //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/ua- us/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

Деякі програмісти намагаються бути обережними. Якщо будь-який вхід очікується, то, можливо, ваш процес може зупинитися. переконайтеся, що нічого дійсно не припиняє ваша програма.

Ви також можете спробувати запустити команду cmd з Process.Start , але я б сказав, що це занадто багато. Це призведе до запуску іншого процесу без керування додатком до C #:

 Process.Start("start /min cmd /c mycommand");
3
додано
Я не на 100% впевнений, що він хоче назвати свій виконуваний файл. Я думаю, що він може захотіти назвати певну функцію або певні функції, які компілюються у його виконуваний файл.
додано Автор Icemanind, джерело
@rodrigogq Я думаю, краще рішення для моєї проблеми полягає у створенні потоку, який викликає функції DLL. Хоча ваша відповідь я міг би використовувати для трохи іншої програми, я теж потребую автоматизації. Привітання
додано Автор Luke, джерело

Як вже було опубліковано, можна скористатися Process.Start з лотка програми C #.

   //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/ua- us/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

Деякі програмісти намагаються бути обережними. Якщо будь-який вхід очікується, то, можливо, ваш процес може зупинитися. переконайтеся, що нічого дійсно не припиняє ваша програма.

Ви також можете спробувати запустити команду cmd з Process.Start , але я б сказав, що це занадто багато. Це призведе до запуску іншого процесу без керування додатком до C #:

 Process.Start("start /min cmd /c mycommand");
3
додано
Я не на 100% впевнений, що він хоче назвати свій виконуваний файл. Я думаю, що він може захотіти назвати певну функцію або певні функції, які компілюються у його виконуваний файл.
додано Автор Icemanind, джерело
@rodrigogq Я думаю, краще рішення для моєї проблеми полягає у створенні потоку, який викликає функції DLL. Хоча ваша відповідь я міг би використовувати для трохи іншої програми, я теж потребую автоматизації. Привітання
додано Автор Luke, джерело

Ви можете запустити програму C з коду .NET через System.Diagnostics.Process. Він буде запускатися в окремому процесі.

Ви також можете вбити процес з коду .NET

1
додано
Запитання стосується програми системного лотка , яка не збігається з консольною програмою, запущеною за допомогою Process .
додано Автор Ken White, джерело

Ви можете запустити програму C з коду .NET через System.Diagnostics.Process. Він буде запускатися в окремому процесі.

Ви також можете вбити процес з коду .NET

1
додано
Запитання стосується програми системного лотка , яка не збігається з консольною програмою, запущеною за допомогою Process .
додано Автор Ken White, джерело

Ви можете запустити програму C з коду .NET через System.Diagnostics.Process. Він буде запускатися в окремому процесі.

Ви також можете вбити процес з коду .NET

1
додано
Запитання стосується програми системного лотка , яка не збігається з консольною програмою, запущеною за допомогою Process .
додано Автор Ken White, джерело
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug