2011-12-11 77 views
3

我想將我的遊戲的某些擴展插入到DLL中,這樣我就可以重新編譯擴展並替換DLL而不用重建整個遊戲。我該如何去做呢?你如何用visual studio構建可替換的DLL?

我在某處讀到每個新版本的DLL必須與舊版本「二進制兼容」。只要我不更改函數名稱,是否使用默認兼容的Visual Studio二進制編譯DLL?

+1

如果使用您的DLL的代碼是用相同版本的Visual Studio編譯的,那麼是的。 –

+1

並且也使用相同的.net框架。這些在.netFW 3.5版本中編譯的dll不能用.netFW的2.0版本編譯的應用程序工作。 –

+0

@Seth Carnegie:VS中是否有設置,或者其他編譯器允許編譯向後兼容的DLL?我一直無法找到關於此問題的任何文檔。 – bitwise

回答

1

如果您從DLL中導出類,如果更改編譯器的版本,則會破壞兼容性。爲了解決這個問題,做到這一點。

製作類接口,如:

class EXPORT_IMPORT_MACROS IMyApi{ 
public: 
virtual void doSomething(IOtherApi* api) = 0; 
virtual void doSomething2(IOtherApi2* api) = 0; 
}; 

,並從DLL導出。它會給你一個獨立於dll實現和可導出的頭文件,這意味着它不會在不同版本的運行時庫中產生任何問題。你也可以看看COM技術。

2

你必須做的不僅僅是保持函數名稱相同。您必須確保稱爲應用程序二進制接口或ABI兼容性。

有很多東西需要超越只是符號名稱。例如,你需要做的事情就是保持通過DLL邊界傳遞的數據結構具有相同的大小,並且編譯器必須放置在你的模塊中定義的任何類成員,但在相同的相對位置上訪問它之外。這很大程度上取決於編譯器的ABI。微軟編譯器有一個壞習慣,不是在不同版本之間進行ABI兼容,而有的編譯器在兼容性方面工作起來有點困難。但請記住,它不僅僅需要使用相同的編譯器。

您可能需要了解如何在您的環境中保持ABI兼容性,因爲它可能涉及比此處列出的更多細節,並且存在很多出錯方法。這裏是one short article就可以了。對於MSVC編譯器可能有更好的。

1

一種方法是重新編譯DLL。只要編譯器(Visual Studio)的版本不變,DLL就是兼容的。否則,您將不得不查看手冊以瞭解Visual Studio版本之間的兼容性。

這樣做的另一種方法是通過使用LoadLibrary function動態加載dll,然後使用GetProcAddress function來檢索要調用的函數的地址。

如果您使用後者,只要您使用export the functions correctly using dllexport並使用dllimport導入它們,就可以使用任何編譯器。更多詳情here

相關問題