我有一个与第三方 COM 对象紧密耦合的 Windows 应用程序。通过这个 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,引用 IPlugin.dll]
class YourPlugin : IPlugin
{
public bool MethodReturningTrue()
{
return true;
}
}
PluginHost.cs [yourapp.exe,引用 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,引用 IPlugin.dll]
class PluginUser
{
public bool GetTrueValueFromPlugin()
{
IPlugin pluginObj = PluginHost.GetPlugin();
pluginObj.MethodReturningTrue();
}
}
当然,这依赖于“YourPlugin.dll”中名为“YourPlugin”的类。在支持多个 .dll 的生产环境中,您将枚举 .dll,加载每个程序集,并使用反射在该程序集中查找实现IPlugin
接口的类。如果您需要插件和主机之间的双向通信,您可以创建另一个接口(即 . IPluginHost
)并添加一个IPlugin
接受IPluginHost
. 然后,实现类可以存储该实例并调用方法以实现双向通信。