如何编写可以轻松使用多个第三方 com 对象的 Windows 应用程序

本文关键字:com 第三方 对象 应用程序 Windows 何编写 | 更新日期: 2023-09-27 18:35:30

我有一个与第三方COM对象紧密耦合的Windows应用程序。通过这个com对象的实例,我所做的就是创建,删除,保存和导出。现在,随着新需求的出现,我必须添加另一个类似的第三方组件,但来自不同的供应商。

我不想编写与第一个类似的单独应用程序,除了第三方依赖项更改。

我应该如何更改我的 Windows 应用程序,以便

  1. 我可以轻松切换这些第三方依赖项。(比如松散耦合的东西)。
  2. 我不需要维护单独的代码。

我需要一些方向。

如何编写可以轻松使用多个第三方 com 对象的 Windows 应用程序

一种选择(可能不适合您)是编写一个所有插件都将继承的接口,其中包含您需要从每个 COM .dll实现的抽象方法。然后,每个插件都是一个 C# 类库,它实现接口,并将所有调用传递给后端 COM 对象。

这意味着您将提供 3 个新 DLL,一个包含您的接口(并由主应用程序和 .NET 类库引用),.NET 类库作为主"插件",然后是后端 COM .dll。

就像我说的,这只是一种方法,但可以让您快速启动并运行,而 IMO 开销很小。


简单示例:

IPlugin.cs [IPlugin.dll]

interface IPlugin
{
    bool MethodReturningTrue();
}

YourPlugin.cs [YourPlugin.dll, reference IPlugin.dll]

class YourPlugin : IPlugin
{
    public bool MethodReturningTrue()
    {
        return true;
    }
}

PluginHost.cs [yourapp.exe, reference IPlugin.dll]

class PluginHost
{
    public static IPlugin GetPlugin()
    {
        Assembly asmbly = Assembly.LoadFrom("YourPlugin.dll");
        Type objectType = asmbly.GetType("YourPlugin");
        return (IPlugin)Activator.CreateInstance(objectType);
    }
}

PluginUser.cs [yourapp.exe, reference IPlugin.dll]

class PluginUser
{
    public bool GetTrueValueFromPlugin()
    {
        IPlugin pluginObj = PluginHost.GetPlugin();
        pluginObj.MethodReturningTrue();
    }
}

当然,这取决于在"YourPlugin.dll"中称为"YourPlugin"的类。在支持多个 .dll 的生产环境中,您将枚举 .dll,加载每个程序集,并使用反射在该程序集中查找实现 IPlugin 接口的类。如果需要插件和主机之间的双向通信,可以制作另一个接口(即。 IPluginHost ) 并向 IPlugin 添加一个接受 IPluginHost 实例的方法。然后,实现类可以存储该实例并调用方法以使双向通信就位。