2017-06-26 15 views
1

何年も前から、私が通常使っている多くのオブジェクトと機能を含むC#で自分自身のWindows .dllを書きました。これまで、私のすべてのプログラムはコンソールアプリケーションでしたので、私のdll関数はステータス、エラー、出力をコンソールに書き出します。たとえば、"Loading polygon file : Fred.txt"または"Imported 268 polygons from file"です。今ではWindowsフォームプログラムを書き始めていますが、dll関数を再利用したいのですが、明らかにFormsアプリケーションのコンソールに書き込むことはできません。C#.DLLライブラリ - コンソールとフォームWindowsアプリケーションのベストプラクティス

コンソールとフォームプログラムの両方に使用される関数を含むdllを処理する最良の方法はありますか?すべての機能の2つのバージョンを用意するのが最善でしょうか?フォームから関数が呼び出され、コンソールに書き込まれていないかどうかを調べる方法はありますか?

おかげで、 マーク

+0

たとえば、ストリームに書き込んでいる1つのdllを持つことができます(これにはStreamWriterを使用できます)。ストリームをDllメインオブジェクトコンストラクタに渡すと、dllはそのストリームで動作します。ストリームとして、Console.OpenStandardOutput()またはFileStreamなどを渡すことができます。 –

答えて

2

は、あなたのWindowsフォームアプリケーションでメッセージを表示しますか?通常、DLLはメッセージ表示などのUI操作を処理しません。彼らはですが、実際に探しているのであればログを処理してください。私はNLogのようなロギングフレームワークを調べ、DLLに実装する必要があると言います。

DLLを参照するWinFormsプロジェクトがあれば、DLLから情報を渡してUIレベルで表示できます。それは適切なアプリケーションアーキテクチャの問題です。理想的には、DLLは、コンソールアプリケーションやWinFormsアプリケーションのように、使用されている方法を知らないでしょう。

0

"明らかにFormsアプリケーションのコンソールに書き込むことはできません。

これはまったく真実ではありません。 にコンソールを割り当て、そのコンソールに情報を書き込むことができます。だからあなたのフォームとあなたの出力を書いているコンソールを持っています。これはデバッグに最適です。

また、コンソール出力をファイルにリダイレクトすることもできます。 StreamWriterへの参照をConsole.SetOutに渡すだけで、コンソールに書き込んでいたものはすべてそのファイルに移動します。非公式のロギングを行うには最適な方法です。

Windowsフォームアプリケーションでメソッドの出力とエラーメッセージを表示したい場合は、出力を送信するためにそれらをどこかに与える必要があります。おそらく、あなたのライブラリメソッドをたくさん書き直す必要があります。考え方は、コンソールに書き込むのではなく、それらのメソッドがあなたが提供する出力メソッドを呼び出すということです。 そのメソッドはおそらくインターフェイスの一部です。それでも、すべてのユーザーインターフェイスのシナリオで情報を報告する方法をライブラリが知っていることを前提としているため、これは特に効果的な方法ではありません。

一般に、ワーカー・メソッドがユーザー・インターフェース出力を提供しないようにするのが一般的です。ロギングは確かですが、おそらくファイルからのデータをロードしてユーザーに出力する機能(「ファイルから287レコードをロードした」)は望ましくないでしょう。もちろん、一例であり、

// in your console program 
List<Thing> things = LoadThingsFromFile("filename.txt"); 
Console.WriteLine($"Loaded {things.Count} things from file."); 

// in your Windows Forms application 
List<Thing> things = LoadThingsFromFile("filename.txt"); 
StatusLine.Text += $"Loaded {things.Count} things from file."; 

StatusLine.Text:代わりに、あなたのような何かを持っています。これをスクロールリストに入れたり、メッセージボックスをポップアップしたりするなど、処理コードではなくUIコードで情報をユーザーに伝達する方法を決定することが重要です。

関連する問題