我有一個與第三方COM對象緊密耦合的Windows應用程序。通過這個com對象的實例,我所做的就是創建,刪除,保存和導出。現在隨着新的要求出現,我不得不添加另一個類似的第三方組件,但來自不同的供應商。如何編寫一個可以輕鬆處理多個第三方com對象的windows應用程序?
我不想編寫單獨的應用程序,它與第一個類似,除了第三方依賴項已更改。
我應該如何改變我的Windows應用程序,以便
- 我可以輕鬆地切換這些第三方的依賴。 (比如鬆散耦合的東西)。
- 我不需要維護單獨的代碼。
我需要一些方向。
我有一個與第三方COM對象緊密耦合的Windows應用程序。通過這個com對象的實例,我所做的就是創建,刪除,保存和導出。現在隨着新的要求出現,我不得不添加另一個類似的第三方組件,但來自不同的供應商。如何編寫一個可以輕鬆處理多個第三方com對象的windows應用程序?
我不想編寫單獨的應用程序,它與第一個類似,除了第三方依賴項已更改。
我應該如何改變我的Windows應用程序,以便
我需要一些方向。
一個選項(可能不適合你)是編寫一個所有插件將繼承的接口,其中包含你需要從每個COM .dll實現的抽象方法。然後,每個插件都是一個C#類庫,它實現了接口,並將所有調用傳遞給後端COM對象。
這意味着你將發佈3個新的DLL,一個包含你的接口(並且被主應用程序和.NET類庫引用),一個.NET類庫作爲主'插件',然後後端COM .dll也。
就像我說的那樣,它只是一種方式,但它可以讓你快速啓動並且很小的開銷。
簡單的例子:
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的生產環境中,您將枚舉.dlls,加載每個程序集,然後使用Reflection在該程序集中查找實現IPlugin
接口的類。如果您需要插件和主機之間的雙向通信,則可以創建另一個接口(即IPluginHost
)並向IPlugin
添加方法,該方法接受IPluginHost
的實例。然後實現類可以存儲該實例並調用方法來實現雙向通信。
編程到接口。該接口包含您需要執行的所有常用方法,並且您只需提供一個利用每個COM對象的實現。關鍵字,「抽象」。 –