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

Posted

技术标签:

【中文标题】使用 GUI 制作 COM 服务器的最佳实践是啥?【英文标题】:What is the best practise for making a COM server with a GUI?使用 GUI 制作 COM 服务器的最佳实践是什么? 【发布时间】:2018-02-28 09:04:12 【问题描述】:

上下文

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

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


问题

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

public class ServerForm : Form, Interface1, Interface2  

我可以这样拆分它们:

public class ServerForm : Form  

public class MyImageProcessor : Interface1, Interface2  

但我仍然需要从 MyImageProcessor 类访问表单。我尝试通过这样的构造函数将表单传递给 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。

我该如何解决这个问题?

【问题讨论】:

可以私下实现一个接口:blogs.msdn.microsoft.com/johnwpowell/2008/06/13/… 您希望机器人软件通过传递一个 Form 对象来创建您的类的实例。那是行不通的,它不知道有关表单的bean。硬性规则是,当一个对象有一个不带参数的公共构造函数时,它只能是 [ComVisible(true)]。这个问题还有很多,在 C# 中创建进程外服务器非常复杂和脆弱,并且不直接支持。在您为此浪费大量时间之前先谷歌一下。 @SimonMourier 恐怕行不通,因为我无法更改使用这些函数的类的代码,但感谢您让我学到了一些新东西! @HansPassant 你是绝对正确的。你的评论确实让我意识到还有很多我不知道的。我已经想出了一个临时解决方案来解决这个问题,但我相信还会有更多,我会联系机器人制造商,看看他们是否能提供帮助。 【参考方案1】:

此解决方案解决了上述两个问题: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();
        

我想强调的是,这解决了现在的问题,如果我一切正常,我会尝试更新这篇文章。

【讨论】:

以上是关于使用 GUI 制作 COM 服务器的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AutoLayout 的最佳实践是啥?

在浏览器中制作 MVC Dojo 应用程序的最佳实践方法是啥?

Firestore 数据结构的最佳实践是啥?

DAO(数据访问对象)最佳实践 - 我看到的示例同时使用 DAO 和服务对象,这里的最佳实践是啥?

在 laravel 中添加常量的最佳实践是啥? (长名单)

MVC 验证 - 使用服务层保持 DRY - 最佳实践是啥?