2014-06-07 91 views
4

在處理tAPI(Terraria(如果您不知道遊戲,只是查看它,很棒)修改API)時,我們遇到了問題與跨模塊代碼引用。基本上,你可以調用其他mod的方法(只要你告訴mod生成器顯然添加對那個mod的引用),但是當你嘗試重新加載mod時,你不能確定東西會工作:if你引用其他MOD中的任何職業,它總是會使用裝載遊戲的FIRST版本,而不是最新版本。這意味着你不能調用任何靜態或實例化來自其他mod的類,當你在處理某種API時,這是一個真正的問題。我可以強制C#/ .NET使用最新版本的程序集

mods本身就是標準的C#代碼,有一些額外的JSON數據我們解析。

我想這樣做的TAPI源代碼之外同樣的事情,這是我取它(長碼,告訴pastebin.com爲永不過期雖然貼):http://pastebin.com/hjY57xJh

它具有完全相同的問題雖然。第二次調用靜態方法時,它應該打印「456」,而不是「123」。

所以,我的問題是:我能做任何事情來迫使遊戲使用最新的程序集而不是第一個?

我們考慮過使用AppDomains,但他們實施起來很痛苦,據我所知,他們通過序列化數據來工作,這可能會使遊戲由於必須進行的調用而顯得無法播放到MODS。

編輯:我真的不介意這個事實,該組件仍然用完「重新加載」mods後的內存。我只是想在「重新加載」之後新的程序集優先於舊的程序集。

+0

如果您強烈要求籤名,您可能會在尋找[程序集重定向](http://www.bing.com/search?q=c%23+assembly+redirect+config)。你也可能想閱讀加載程序集和上下文/版本 - [Suzanne Cook的博客](http://www.bing.com/search?q=c%23+assembly+load+suzanne+cook)是一個好開始。多個AppDomain是不太可能的答案,因爲大多數API不能很好地跨越這種邊界。 –

+0

程序集重定向似乎是僅在實際應用程序執行之前纔可用的功能,我不認爲有應用程序已經運行時實際使用它的方法。 – Shockah

+0

現在問題的前半部分(將相同程序集的多個版本加載到單個AppDomain中)與SO(搜索)上的許多類似帖子相同;第二部分(重新指向新程序集的父API)需要更多的細節,最明顯的實現是定製版本感知代理,它將一方面與API協同工作,另一方面與您想要的任何版本的程序集綁定。 –

回答

1

我完全忘了這個問題,但是:最後我們有點忽略了這個問題。 tAPI mods現在可以擴展ModBase或APIModBase。如果你使用後者,遊戲永遠不會真的試圖重新加載mod(彙編) - 在第一次加載之後它將保持不變,直到你重新開始遊戲。這對Mod的人來說有點煩人,但是對於這個事實並沒有太多可以做的事情。至少所有隻依賴於API模塊的內容模塊都可以自由地重新加載而不會造成任何問題。

相關問題