【问题标题】:Call an existing class from a c# form从 c# 表单调用现有类
【发布时间】:2025-12-16 19:45:02
【问题描述】:

我有一个名为Telescope 的大型公共课程。我创建了一个新表单 (form1.cs),我想调用该类的一些公共 void。

我在表单中做这样的事情来初始化类

Telescope controls = new Telescope(); controls.CommandString("Gs#",true);

之后我可以看到所有的方法,但是执行失败,因为类已经初始化并且有一个现有的串口连接正在进行,所以它报告没有串口连接。

有什么帮助吗? 如何使用新表单中的现有方法?

Telescope 类在 Driver.cs 中

public string CommandString(string command, bool raw)
{
    CheckConnected("CommandString");
    serialPort.ClearBuffers();
    serialPort.Transmit(command);
    return serialPort.ReceiveTerminated("#");

}

当我在 Driver.cs(望远镜类所在的位置)中使用 CommandString 时,它可以工作。它不适用于 form1.cs

我得到一个例外:

************** Exception Text ************** 
ASCOM.NotConnectedException: CommandString

【问题讨论】:

  • 这行得通。现在,您的 Telescope 类中到底发生了什么以及为什么它不起作用只有您才能知道,除非您发布代码。
  • @IvanIčin 他正在尝试连接到串行端口......这有点超出了 C# 的范围。但是一个通信端口一次只能保持一个连接。
  • 等等,我不想再连接串口了。我只想利用现有的连接。让我编辑帖子

标签: c# .net ascom


【解决方案1】:

理想情况下,您将使用某种 IoC 容器,并且您的类将实现一个接口,其中包含与您的串行连接接口的最简单的方法。然后,IoC 容器将作为单例管理实例的生命周期,并且在每次请求解析接口时,都会将现有实例传回给您。

由于情况可能并非如此,并且由于只有单个实例可以访问串行端口,因此您可以将这些方法移动到静态类中...但是要小心,当您开始共享静态方法时,可能会出现意外错误。 根据代码的结构,您可能只希望串行连接是静态的。

一个如何在类中实现的示例:

private Lazy<SerialConnection> _serialConnection =new Lazy<SerialConnection>(StaticClass.GetStaticSerialConnection);
public SerialConnection MySerialConnection
{
  get { return _serialConnection.Value; }
}

【讨论】:

  • 我修改了帖子以获取更多信息。我认为它很模糊,解决方案更简单
  • @evans 我相信我的回答正确地涵盖了这个问题。问题是您无法在一个通信端口上打开两个串行连接。例如,如果您打开 putty 并尝试连接端口,它也会失败。您需要以某种方式共享通讯连接。
【解决方案2】:

您应该在应用中的某个位置保留对 Telescope 类的第一个(也是唯一一个)实例的引用,然后通过该引用访问它。引用可以保存在某个静态类中,您可以在那里对其进行初始化并始终使用该静态类调用它。

【讨论】:

  • 像静态一样处理实例和像静态一样传递它,以及仅将方法用作静态有什么区别?