2011-04-01 83 views
0

是這樣的可能嗎?如果是這樣,你能指出我在正確的方向學習如何?DLL反射?

applicationx tries to run the method start() in dll_one.dll 
dll_one.dll runs the command 
applicationx tries to run the method run() in dll_one.dll 
dll_one.dll doesn't have a method run() and hasn't prepared for such an occurance. 
dll_one.dll asks dll_two.dll if it has a run() 
dll_two runs run() 

基本上,我想要它,所以如果dllA沒有應用程序正在尋找的方法,它會詢問dllB。這同樣假設ApplicationX和dllB不知道任何關於dllA和dllA的東西,這些東西剛剛出現(我想動態地將dll動態地添加到我的應用程序的補丁中,而不必重寫所有的方法,屬性等在dll中,還有其他所有的東西都被路由到了舊的dll)。

任何想法?請記住,我正在使用vb.net,因此.net引用是讚賞。

回答

1

你要求的具體事情是不可能的。您不能將不存在的方法調用自動重新路由到不同的dll。除非你編譯了代碼,否則你不能「在dll_one.dll中運行方法run()」,如果該方法不存在,它將不會編譯。你也不能編譯對dllB的代碼,然後放入dllA並攔截方法調用。反思可以想象地解決你的問題的一部分,但你不希望將你的代碼基於反射調用所有的方法 - 它會是可怕的不可操作性,不可維護。

安東暗示,插件的方法可能會起作用。但是,這將依賴於您能夠爲您的插件預先指定接口,這聽起來像與您的原始要求相矛盾。

另一個問題:如果直到後期才部署dllA,那麼ApplicationX如何知道在dll_one.dll中調用方法start()呢?您肯定需要重新部署至少該部分的基本應用程序才能正常工作。

這些類型的問題通常具有一組更具體的要求來解決:您可能想要在未來擴展或更改哪些功能?您是否可以支持一組通過插件實現可擴展性的通用接口,或者您是否需要使用新功能重新部署應用程序的封裝塊?有涉及UI還是僅僅是爲了改變後端邏輯?像這樣的問題可能有助於提出更可行的解決方案。

+0

那麼,我計劃將dllB重命名爲其他內容,然後將dllA重命名爲dllB。當第一個應用程序啓動時,它會使用前一個dllB名稱的名稱引用該dll。據我的理解,這應該工作......對嗎?類似的東西... – FreeSnow 2011-04-01 11:14:41

+0

這是一個真正可怕的方式修補應用程序... – 2011-04-01 11:21:58

+0

您的評論不適用或幫助回答我的問題。我完全清楚。 – FreeSnow 2011-04-01 11:25:47

4

看起來您正在爲您的應用程序尋求插件架構(除了「補丁」部分困擾我)。如果是這樣,你可以嘗試MEF,這解決了這個確切的問題。

+0

有趣的是,這看起來不像它完全像我想要的那樣,但它呢?仍然是一個非常有趣的發現。 – FreeSnow 2011-04-01 11:05:58

+0

「補丁」部分來自關於dllA方法替換dllB的部分。這是一個醜陋的想法;沒有一些反省手段,dllA不能在dllB中引用任何私有的東西。我可以看到,真的很毛茸茸,真的很快。一個插件架構真的會更好。 – cHao 2011-04-01 11:13:51