.net 将DLL报告返回到主窗体
我正在构建一个带有GUI模式(一个项目)和控制台模式(另一个项目)的.NET解决方案。每个项目都引用一个共享类库,该类库保存每个应用程序背后的共享逻辑核心。我希望DLL尽可能与每个客户端应用程序隔离。如何让DLL向gui报告进度?现在,GUI项目引用DLL。VS2010/.NET不允许我从DLL引用GUI,因为它是循环引用.net 将DLL报告返回到主窗体,.net,visual-studio,design-patterns,.net,Visual Studio,Design Patterns,我正在构建一个带有GUI模式(一个项目)和控制台模式(另一个项目)的.NET解决方案。每个项目都引用一个共享类库,该类库保存每个应用程序背后的共享逻辑核心。我希望DLL尽可能与每个客户端应用程序隔离。如何让DLL向gui报告进度?现在,GUI项目引用DLL。VS2010/.NET不允许我从DLL引用GUI,因为它是循环引用 我该怎么做?在.NET设计或一般的软件设计中,有没有处理这个问题的一般原则?有没有一种方法可以在不引用调用项目的情况下使用回调?如果设计需要循环引用,那么您应该在需要的地方重
我该怎么做?在.NET设计或一般的软件设计中,有没有处理这个问题的一般原则?有没有一种方法可以在不引用调用项目的情况下使用回调?如果设计需要循环引用,那么您应该在需要的地方重新设计该部分代码
我建议将相关代码放入打破循环引用的最简单方法是创建两个模块都引用的另一个库
另一种选择是使用可由逻辑DLL引发并在gui/控制台部分中处理的事件。我觉得,DLL中需要一个自定义事件,然后将其附加到gui中 这里有一些代码可以让它更容易理解 首先,让我们创建一个DLL的模拟,它执行类似于加载的操作,并且还定义了一个我们可以在GUI中附加的事件,该事件接收到完成百分比:
public class MyDLLType
{
public decimal PercentageComplete = 5;
public event EventHandler<CustomEventArgs> StatusChanged;
public virtual void OnStatusChanged(CustomEventArgs e)
{
if(StatusChanged != null)
{
StatusChanged(this, e);
}
}
public void DoSomething()
{
var eventArgs = new CustomEventArgs();
eventArgs.PercentageComplete = PercentageComplete;
OnStatusChanged(eventArgs);
if(PercentageComplete < 100)
{
Thread.Sleep(500);
PercentageComplete++;
DoSomething();
}
}
}
答对了,我们的GUI正在从DLL接收完整的百分比,而DLL不需要知道任何关于GUI的信息
我在上面使用的CustomEventArgs如下所示:
public class CustomEventArgs : EventArgs
{
public decimal PercentageComplete{get;set;}
}
听起来您需要DLL中的自定义事件,该事件可以在GUI项目中定义。但是如何在没有引用的情况下从ddl中的GUI引发自定义事件?DLL代码定义事件并在某个点执行该事件。它不知道该事件注册了什么。gui定义要分配给事件处理程序的函数。如果DLL没有对gui的引用,但抛出XYZ错误,请执行此操作。。。GUI会处理一个XYZ错误。。。然后,即使DLL不知道GUI,GUI也会处理XYZ错误?它不是一直都是这样工作的吗?如果您在DLL中使用抛出未处理错误的代码,并在GUI中捕获该错误,那么这是有意义的。DLL永远不需要了解GUI。为什么会这样?
public class CustomEventArgs : EventArgs
{
public decimal PercentageComplete{get;set;}
}