C#システムトレイアプリケーションからCプログラムをスレッドとして実行する方法を教えてください。

以前は WindowsCMD 端末でフォアグラウンドで実行されていたCコンソールアプリケーションがあり、ユーザーのキー入力を受け付けます。ただし、現在は背景に移動する必要があり、ユーザー入力は不要です。

システムトレイを作成しました。これは右クリックで正しく実行され、右クリックで正しく動作します。そして機能性をする端末プログラムがあります。

プログラムをもう一度書き直すのではなく、端末を必要としない既存のプログラムから関数を呼び出すスレッドを作成できるようにしたいです。

アプリケーションがキーストロークなどに応答するのと同様に、コンソールの対話型の側面がコードから削除されていることを強調するために、これによって物事が少し明確になります。

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

(私は一般的にもっとCの埋め込みを使っているPCプログラマーではないので.NETは私にとって全く異物です。どんな助けでも大いに感謝されます)

2
答えるのに十分な詳細はありません....しかしあなたの.NETプログラムがバックグラウンドであなたのコンソールアプリケーションを起動することは可能です。
追加された 著者 Keith Nicholas,
答えるのに十分な詳細はありません....しかしあなたの.NETプログラムがバックグラウンドであなたのコンソールアプリケーションを起動することは可能です。
追加された 著者 Keith Nicholas,
答えるのに十分な詳細はありません....しかしあなたの.NETプログラムがバックグラウンドであなたのコンソールアプリケーションを起動することは可能です。
追加された 著者 Keith Nicholas,
トレイアプリケーションがプロセスを起動できる
追加された 著者 Keith Nicholas,
トレイアプリケーションがプロセスを起動できる
追加された 著者 Keith Nicholas,
トレイアプリケーションがプロセスを起動できる
追加された 著者 Keith Nicholas,
@ rodrigogq - すみません。私はあなたに悪いアドバイスをしたかもしれません。彼の質問から、彼はCプログラムから関数を呼び出せるようにしたいと思ったのです。あなたの答えが彼のために働くならば、それは間違いなくより簡単で、あなたは答えの信用に値します。いずれにせよ、私はあなたの答えを支持しました。
追加された 著者 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 - すみません。私はあなたに悪いアドバイスをしたかもしれません。彼の質問から、彼はCプログラムから関数を呼び出せるようにしたいと思ったのです。あなたの答えが彼のために働くならば、それは間違いなくより簡単で、あなたは答えの信用に値します。いずれにせよ、私はあなたの答えを支持しました。
追加された 著者 Icemanind,
@ rodrigogq - すみません。私はあなたに悪いアドバイスをしたかもしれません。彼の質問から、彼はCプログラムから関数を呼び出せるようにしたいと思ったのです。あなたの答えが彼のために働くならば、それは間違いなくより簡単で、あなたは答えの信用に値します。いずれにせよ、私はあなたの答えを支持しました。
追加された 著者 Icemanind,
@rodrigogq - 彼の質問から、彼は「私は私の既存のプログラムから関数を呼び出すスレッドを作成したいと思います」と述べています。
追加された 著者 Icemanind,
@rodrigogq - 彼の質問から、彼は「私は私の既存のプログラムから関数を呼び出すスレッドを作成したいと思います」と述べています。
追加された 著者 Icemanind,
うん、最良の方法は1つ以上の関数をエクスポートするDLLとしてあなたのCプログラムを再構築することです。私はこの方法に慣れていないが、C#から任意のDLLを呼び出すことができると確信している。
追加された 著者 Harry Johnston,
うん、最良の方法は1つ以上の関数をエクスポートするDLLとしてあなたのCプログラムを再構築することです。私はこの方法に慣れていないが、C#から任意のDLLを呼び出すことができると確信している。
追加された 著者 Harry Johnston,
うん、最良の方法は1つ以上の関数をエクスポートするDLLとしてあなたのCプログラムを再構築することです。私はこの方法に慣れていないが、C#から任意のDLLを呼び出すことができると確信している。
追加された 著者 Harry Johnston,
@ rodrigogq DLLとして再構築するつもりです。 Rodrigogqは、プロセスを開始して終了することができるかもしれないと述べましたが、これが最も単純なオプションのように思えるので、構文的にどのようにこれを実行できるでしょうか。またはこれは良い考えではありませんか?
追加された 著者 Luke,
@icemanindこんにちは私はおそらくDLLにエクスポートします。ただし、プロセスを開始および終了できないだけの理由はありません。私は自分の関数をスレッドから呼び出そうとしていると言っていましたが、バックグラウンドでCアプリケーションを(ターミナルを開かずに)起動し、システムアプリケーションで閉じることができるのであれば、どうしていいのでしょうこのようにしないでください...ありがとう
追加された 著者 Luke,
@icemanindこんにちは私はおそらくDLLにエクスポートします。ただし、プロセスを開始および終了できないだけの理由はありません。私は自分の関数をスレッドから呼び出そうとしていると言っていましたが、バックグラウンドでCアプリケーションを(ターミナルを開かずに)起動し、システムアプリケーションで閉じることができるのであれば、どうしていいのでしょうこのようにしないでください...ありがとう
追加された 著者 Luke,
@icemanindこんにちは私はおそらくDLLにエクスポートします。ただし、プロセスを開始および終了できないだけの理由はありません。私は自分の関数をスレッドから呼び出そうとしていると言っていましたが、バックグラウンドでCアプリケーションを(ターミナルを開かずに)起動し、システムアプリケーションで閉じることができるのであれば、どうしていいのでしょうこのようにしないでください...ありがとう
追加された 著者 Luke,
興味のある人は誰でもエンケース:私はrodrigogqとicemanindの両方のソリューションを実装しました。 Process.Startを使用するための-rodrigogqソリューションは信じられないほど簡単に実装できました(役に立つ関連リンクは
追加された 著者 Luke,
興味のある人は誰でもエンケース:私はrodrigogqとicemanindの両方のソリューションを実装しました。 Process.Startを使用するための-rodrigogqソリューションは信じられないほど簡単に実装できました(役に立つ関連リンクは
追加された 著者 Luke,
icemanindとrodrigogqは、どちらも私の問題の解決策になると思われる良い答えを出しました。私は月曜日に更新し、どのオプションを使用したか、そしてそれらがどの程度簡単に実装できるかを説明します。
追加された 著者 Luke,
icemanindとrodrigogqは、どちらも私の問題の解決策になると思われる良い答えを出しました。私は月曜日に更新し、どのオプションを使用したか、そしてそれらがどの程度簡単に実装できるかを説明します。
追加された 著者 Luke,
icemanindとrodrigogqは、どちらも私の問題の解決策になると思われる良い答えを出しました。私は月曜日に更新し、どのオプションを使用したか、そしてそれらがどの程度簡単に実装できるかを説明します。
追加された 著者 Luke,
@ rodrigogq DLLとして再構築するつもりです。 Rodrigogqは、プロセスを開始して終了することができるかもしれないと述べましたが、これが最も単純なオプションのように思えるので、構文的にどのようにこれを実行できるでしょうか。またはこれは良い考えではありませんか?
追加された 著者 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,
もし彼が単にプロセスを開始して終了させたいだけなら、どうして彼はこれまでのところ行かなければならないのかわかりません。私はここに何かが足りない? aboutボックスは、端末のバージョンなどを尋ねる必要はありません。それらは別々のものです。
追加された 著者 rodrigogq,
Lukeさん、あなたのCプログラムは、キー入力の王者、ユーザー入力を期待していますか?
追加された 著者 rodrigogq,
Lukeさん、あなたのCプログラムは、キー入力の王者、ユーザー入力を期待していますか?
追加された 著者 rodrigogq,
もし彼が単にプロセスを開始して終了させたいだけなら、どうして彼はこれまでのところ行かなければならないのかわかりません。私はここに何かが足りない? aboutボックスは、端末のバージョンなどを尋ねる必要はありません。それらは別々のものです。
追加された 著者 rodrigogq,
もし彼が単にプロセスを開始して終了させたいだけなら、どうして彼はこれまでのところ行かなければならないのかわかりません。私はここに何かが足りない? aboutボックスは、端末のバージョンなどを尋ねる必要はありません。それらは別々のものです。
追加された 著者 rodrigogq,
@icemanindはどうでもいいです!私はあなたのコードからも学びました! :)
追加された 著者 rodrigogq,
@icemanindありがとうございます。それから私は答えを取り除きました。とにかく、エクスポートは良い選択肢です。
追加された 著者 rodrigogq,
@icemanindありがとうございます。それから私は答えを取り除きました。とにかく、エクスポートは良い選択肢です。
追加された 著者 rodrigogq,
@ルーク私は参考のために私の答えを元に戻しました。何も呼んでいない場合は、実行してみてください。
追加された 著者 rodrigogq,
@ルーク私は参考のために私の答えを元に戻しました。何も呼んでいない場合は、実行してみてください。
追加された 著者 rodrigogq,
@ルーク私は参考のために私の答えを元に戻しました。何も呼んでいない場合は、実行してみてください。
追加された 著者 rodrigogq,
@icemanindはどうでもいいです!私はあなたのコードからも学びました! :)
追加された 著者 rodrigogq,
@icemanindはどうでもいいです!私はあなたのコードからも学びました! :)
追加された 著者 rodrigogq,

7 答え

これがあなたが求めているものかどうかはわかりませんが、C#アプリケーションから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));
    }
}

これですべてです。

ただし、「問題」の1つは、CプログラムとC#プログラムの両方が32ビットまたは64ビットとしてコンパイルされていることを確認することです。 Cプログラムを64ビット、C#プログラムを32ビットとしてコンパイルすることはできません。両方とも同じビット長を使用している必要があります。

4
追加された
@Luke - C#で呼び出せるようにしたい関数を含むCファイルはすべてラップする必要があります。
追加された 著者 Icemanind,
@ルーク - もう一つ。私はあなたのCプログラムがMicrosoftのVisual Studioを使ってコンパイルされていると仮定しました。これが正しくない場合は、お知らせください。回答を更新します。 __declspec(dllexport)はMicrosoftのコンパイラにのみ存在します。他のコンパイラでは、export.defファイルを作成する必要があります。
追加された 著者 Icemanind,
こんにちは、ありがとうございます。複数のCファイルがある場合、それらすべてをDLLでラップする必要がありますか。それとも、メインをDLLとしてラップすると、他のCファイルを呼び出すことができますか。
追加された 著者 Luke,
ありがとうございました。これは変更を実行するのに役立ちます。乾杯
追加された 著者 Luke,
私はMicrosoft Visual Studioの最新の無料版を使っています。
追加された 著者 Luke,

すでに投稿されているように、あなたはあなたのC#アプリケーショントレイから Process.Start を使うことができます。

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

何人かのプログラマーは注意するように言っています。何らかの入力が予想される場合、おそらくあなたのプロセスは停止するかもしれません。あなたのプログラムを本当に停止しないようにしてください。

Process.Start を使って cmd コマンドを起動しようとすることもできますが、多すぎると思います。これにより、C#トレイアプリケーションの制御なしで別のプロセスが開始されます。

 Process.Start("start /min cmd /c mycommand");
3
追加された
私は彼が自分の実行ファイルを呼びたいのかどうか100%確信しているわけではない。私は彼が彼の実行可能ファイルにコンパイルされている特定の関数あるいは特定の関数を呼びたいと思うかもしれないと思います。
追加された 著者 Icemanind,
@ rodrigogq私の問題に対するもっと良い解決策は、DLL関数を呼び出すスレッドを作成することだと思います。あなたの答えは私はわずかに異なるアプリケーションに使用することができるかもしれませんが私も自動化する必要があります。乾杯
追加された 著者 Luke,

すでに投稿されているように、あなたはあなたのC#アプリケーショントレイから Process.Start を使うことができます。

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

何人かのプログラマーは注意するように言っています。何らかの入力が予想される場合、おそらくあなたのプロセスは停止するかもしれません。あなたのプログラムを本当に停止しないようにしてください。

Process.Start を使って cmd コマンドを起動しようとすることもできますが、多すぎると思います。これにより、C#トレイアプリケーションの制御なしで別のプロセスが開始されます。

 Process.Start("start /min cmd /c mycommand");
3
追加された
私は彼が自分の実行ファイルを呼びたいのかどうか100%確信しているわけではない。私は彼が彼の実行可能ファイルにコンパイルされている特定の関数あるいは特定の関数を呼びたいと思うかもしれないと思います。
追加された 著者 Icemanind,
@ rodrigogq私の問題に対するもっと良い解決策は、DLL関数を呼び出すスレッドを作成することだと思います。あなたの答えは私はわずかに異なるアプリケーションに使用することができるかもしれませんが私も自動化する必要があります。乾杯
追加された 著者 Luke,

すでに投稿されているように、あなたはあなたのC#アプリケーショントレイから Process.Start を使うことができます。

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

何人かのプログラマーは注意するように言っています。何らかの入力が予想される場合、おそらくあなたのプロセスは停止するかもしれません。あなたのプログラムを本当に停止しないようにしてください。

Process.Start を使って cmd コマンドを起動しようとすることもできますが、多すぎると思います。これにより、C#トレイアプリケーションの制御なしで別のプロセスが開始されます。

 Process.Start("start /min cmd /c mycommand");
3
追加された
私は彼が自分の実行ファイルを呼びたいのかどうか100%確信しているわけではない。私は彼が彼の実行可能ファイルにコンパイルされている特定の関数あるいは特定の関数を呼びたいと思うかもしれないと思います。
追加された 著者 Icemanind,
@ rodrigogq私の問題に対するもっと良い解決策は、DLL関数を呼び出すスレッドを作成することだと思います。あなたの答えは私はわずかに異なるアプリケーションに使用することができるかもしれませんが私も自動化する必要があります。乾杯
追加された 著者 Luke,

System.Diagnostics.Processを介して.NETコードからCプログラムを起動できます。それは別のプロセスで実行されます。

.NETコードからもプロセスを強制終了できます

1
追加された
この質問ではシステムトレイアプリケーションについて尋ねられますが、これは Process で起動されるコンソールアプリケーションとは異なります。
追加された 著者 Ken White,

System.Diagnostics.Processを介して.NETコードからCプログラムを起動できます。それは別のプロセスで実行されます。

.NETコードからもプロセスを強制終了できます

1
追加された
この質問ではシステムトレイアプリケーションについて尋ねられますが、これは Process で起動されるコンソールアプリケーションとは異なります。
追加された 著者 Ken White,

System.Diagnostics.Processを介して.NETコードからCプログラムを起動できます。それは別のプロセスで実行されます。

.NETコードからもプロセスを強制終了できます

1
追加された
この質問ではシステムトレイアプリケーションについて尋ねられますが、これは Process で起動されるコンソールアプリケーションとは異なります。
追加された 著者 Ken White,