C#.DLL库 - 控制台和窗体Windows应用程序的最佳实践

时间:2017-06-26 17:15:24

标签: c# winforms dll console

多年来,我在C#中编写了自己的Windows .dll,其中包含我通常使用的许多对象和函数。到目前为止,我的所有程序都是控制台应用程序,因此我的dll函数将其状态,错误和输出写入控制台。例如:"Loading polygon file : Fred.txt""Imported 268 polygons from file"。现在我开始编写Windows Forms程序,我想重用dll函数,但显然我不能写一个Forms应用程序的控制台。

有没有人对处理包含用于控制台和表单程序的函数的dll的最佳方法有任何建议?每种功能最好有两个版本吗?有没有办法判断是否从表单调用函数而不是写入控制台?

谢谢, 标记

2 个答案:

答案 0 :(得分:2)

是否要在Windows窗体应用程序中显示消息?通常,DLL不处理UI操作,例如显示消息。然而,他们可以处理日志记录,如果那是你真正想要的。我会说你应该研究一个像NLog这样的日志框架,并在你的DLL中实现它。

如果您有一个引用DLL的WinForms项目,您可以从DLL传递信息并在UI级别显示。这是一个适当的应用程序架构的问题。理想情况下,DLL不知道它的使用方式,即从控制台应用程序与WinForms应用程序。

答案 1 :(得分: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代码而不是处理代码来决定如何将信息传达给用户。