【问题标题】:Generate an Custom event from DLL in C#在 C# 中从 DLL 生成自定义事件
【发布时间】:2011-01-14 15:41:38
【问题描述】:

我正在使用 VS2008 在 C# 中编写一个 DLL。

此 DLL 用作应用程序和串行端口之间的接口。应用程序以特定格式(或遵循标准协议)向此 DLL 发送数据。 DLL 将其转换为串行传输并通过串行端口传输。在其他 PC 上运行并通过串行连接的相同应用程序(意味着像客户端一样运行)接收此数据。相同的 DLL 获取此数据。现在它转换回标准协议并将其放在缓冲区中,以便应用程序可以读取它。

发送数据没有问题,但是在接收时,我在DLL中使用了Serial Data Received事件,以便它可以获取数据并处理它。我的问题是如何向应用程序指示数据已被处理并且可供它使用并且它可以读取缓冲区?

我可以在 DLL 中使用SetEvents 吗?它可以用来指示应用程序使用该 DLL

【问题讨论】:

  • DLL 是 .NET 类库还是本机库?
  • @Jon Skeet 这是一个 .NET 类库。

标签: c# events dll


【解决方案1】:

您应该在处理完 Serial Data Received 事件中的数据后创建一个事件并触发它。如果需要,您可以使用自定义事件参数传递数据。

这是您的 DLL 的代码:

public delegate void dllFinishedHandler(object sender, object tag);
    public event dllFinishedHandler DllFinished;
    protected virtual void OnDllFinished(object e)
    {
        if (DllFinished!= null)
            DllFinished(this, e);
    }

在实现代码后,您应该在应用程序中设置事件处理程序。

下面的代码将一个对象传递给应用程序。您也可以使用 SerialDataReceivedEventArgs 或您的自定义事件处理程序,它可能看起来像这样:

 public delegate void dllFinishedHandler(object sender, SerialDataReceivedEventArgs eventArgs);
    public event dllFinishedHandler DllFinished;
    protected virtual void OnDllFinished(SerialDataReceivedEventArgs e)
    {
        if (DllFinished!= null)
            DllFinished(this, e);
    }

从 EventArgs 继承并在下面的代码中使用它而不是 SerialDataReceivedEventArgs:

public class DllEventArgs : EventArgs
{
    private byte[] buffer;

    public byte[] Buffer
    {
        get
        {
            return buffer;
        }
    }

    public DllEventArgs(byte[] buff)
    {
        buffer = buff;
    }
}

然后您的应用程序可以到达缓冲区(我猜它的字节 [] 直接来自事件)。

【讨论】:

    【解决方案2】:

    您知道何时处理数据。如果是的话,

    if(Processed != null)
     Processed(this, new EventArgs());
    

    将类中的事件标记为

    public event EventHandler Processed
    

    您还可以传递自定义事件参数并使用通用 EventHandler

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多