.net 将DLL报告返回到主窗体

.net 将DLL报告返回到主窗体,.net,visual-studio,design-patterns,.net,Visual Studio,Design Patterns,我正在构建一个带有GUI模式(一个项目)和控制台模式(另一个项目)的.NET解决方案。每个项目都引用一个共享类库,该类库保存每个应用程序背后的共享逻辑核心。我希望DLL尽可能与每个客户端应用程序隔离。如何让DLL向gui报告进度?现在,GUI项目引用DLL。VS2010/.NET不允许我从DLL引用GUI,因为它是循环引用 我该怎么做?在.NET设计或一般的软件设计中,有没有处理这个问题的一般原则?有没有一种方法可以在不引用调用项目的情况下使用回调?如果设计需要循环引用,那么您应该在需要的地方重

我正在构建一个带有GUI模式(一个项目)和控制台模式(另一个项目)的.NET解决方案。每个项目都引用一个共享类库,该类库保存每个应用程序背后的共享逻辑核心。我希望DLL尽可能与每个客户端应用程序隔离。如何让DLL向gui报告进度?现在,GUI项目引用DLL。VS2010/.NET不允许我从DLL引用GUI,因为它是循环引用


我该怎么做?在.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;}
}