使用 GUI 制作 COM 服务器的最佳实践是什么?

What is the best practise for making a COM server with a GUI?

上下文

我正在使用一些旧的机器人软件,如果它实现了一些预定义的接口,它能够从 COM 对象获取信息。由于这个旧软件在 Windows 2000 上运行,我想使用 DCOM 来(尝试)避免为 Windows 2000 编译一些东西。(我知道必须调用的程序可能需要也可以在 Windows 2000 计算机上工作,或者至少存在)

另一台计算机将通过 DCOM 调用,并使用一组配置的步骤处理图像。我想要一个 GUI 来显示传入和传出图像以及更改它所执行的步骤的能力。


问题

图像处理器需要实现两个接口,但接口 1 包含一个 Load 函数,Form 也是如此,但两者都需要保持可访问性,所以我认为我不能使用new 关键字。因此下面的代码将不起作用。

public class ServerForm : Form, Interface1, Interface2 { }

我可以这样拆分它们:

public class ServerForm : Form { }

public class MyImageProcessor : Interface1, Interface2 { }

但我仍然需要从 MyImageProcessor class 访问表单。我尝试通过构造函数将表单传递给 MyImageProcessor,如下所示:

static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            ServerForm sv = new ServerForm();
            MyImageProcessor mip = new MyImageProcessor(sv);
            Application.Run(sv);
        }
    } 

但是当我使用 regasm CSharpServer.exe /regfile:CSharpServer.reg 检查注册表中添加了哪些项时,只显示 ServerForm 而不是 ImageProcessor。

我该如何解决这个问题?

此解决方案修复了上述两个问题:两个 load 函数将保持可用并生成正确的注册表项,但我不会这样做是否会在以后给 COM 带来任何问题。 (可能会)

我把它一分为二类。 ServerForm 是从 MyImageProcessor.

的构造函数生成的 运行
public class MyImageProcessor : Interface1, Interface2{
    private static ServerForm sv;      

    public MyImageProcessor () {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        sv = new ServerForm();
        Application.Run(sv);
    }
}

public class ServerForm : Form {
        public ServerForm() {
            InitializeComponent();
        }
}

我想强调一下,这解决了 现在 的问题,如果一切正常,我会尝试更新此 post。