一. 幾個概念:
- WinRT :
Windows Runtime, windows運行時。創建Windows運行時(WinRT)是為了在Windows上給用戶提供一種流暢且安全的應用體驗。WinRT會受到.NET、C++、以及JavaScript三者的影響。WinRT不會取代CLR或Win32,而是為那些使用不同語言編寫的應用程序提供統一支持,以便它們可使用新的Metro風格用戶界面運行於Windows之上。
兩年前,微軟從一個願望開始了Windows運行時(WinRT)的研發工作,此願望是,建立一個更好的開發平台,讓開發者在此平台上使用具有豐富智能感知功能和優秀調試功能的工具來創造快速、流暢、可靠的應用程序,而且開發者可自由選擇所使用的語言和庫。最終結果是產生了一種架構以及一組可以從.NET語言(C#、VB.NET、F#)、C++、以及HTML/JavaScript調用的API。所有這些語言都會對WinRT的設計產生影響。WinRT不是為了取代.NET或Win32提供的所有功能,但是它是一個公共平台,以便那些使用不同語言編寫的應用程序可使用新的Metro風格界面來運行。
(詳細介紹參見:http://www.infoq.com/cn/news/2011/09/Design-Details-Windows-Runtime)
2. Win32 dll:
傳統的Win32 dll
3. WinRT dll:
可以把WinRT dll看做是傳統的Win32 dll,它們都是按照傳統dll的封裝形式,把接口或者類export出來,唯一的區別就是WinRT dll可以支持WinRT及其API。
4. WinRT Component:
WinRT組件的最大目的就是為了使組件能更好的支持被多種開發語言使用(js,C++,C#,VB)。而為了讓開發者可以更方便的開發WinRT組件,微軟又擴展了C++,也就是所謂的C++ /CX,所以基於C++ /CX風格的WinRT組件在接口風格,export形式上跟傳統dll會有一定區別。
5. Windows Store Application:
Windows應用商店程序。Windows 應用商店應用是一類新型的應用程序,它在 Windows 8 設備上運行。Windows 應用商店應用不同於傳統桌面應用。簡單來說就是具有Metro風格的應用。
可以使用JavaScript、C#、Visual Basic 或 C++創建 Windows 應用商店應用。甚至可以采用一種語言編寫組件,然后在采用另一種編程語言編寫的應用中使用這些組件。
Windows 應用商店應用可以使用 Windows 運行時,一個內置於操作系統的本機 API。此 API 采用 C++ 實現,並支持 JavaScript、C#、Visual Basic 和 C++,對於每種語言都以非常自然的方式支持。
6. Windows8 Platform and Tools圖

二. 在Windows Store app中如何復用傳統Win32 dll:
- 新建一個WinRT dll的工程,把原來win32 dll的代碼和配置直接移過來,編譯時應該會發現一堆錯誤,基本應該都屬於原來代碼中用到了很多WinRT中不再支持的API,關於API的整合可以參考下文:
(【windows8開發】現有代碼移植到Metro App所必須的API整合
http://blog.csdn.net/my_business/article/details/7895879 )
2. WinRT Dll 編譯通過后,可以被WinRT組件和Windows應用商店程序調用。但是在調用時有一些限制。
簡單來說就是:如果你的Windows Store app本身就是想用C++實現,那你可以在app中直接象往常加載dll一樣的調用方式(導入lib或者LoadLibrary),就可以使用WinRT DLL了。
如果你的app本身要用C++以外的語言,C#或者js,那最好還是再封裝一個WinRT組件,把WinRT DLL的接口包進來,方便被App調用, 有些文檔中說可以在C#等app中直接add reference來關聯WinRT DLL,但我試下來都失敗了,而且即使是封裝的WinRT組件,也必須是C++的工程,否則也無法引用WinRT DLL。
下面是我試驗得出的結論:

3. 應注意的問題:
(1).在WinRT DLL工程中,在.h文件開頭處,確保將 __declspec(dllexport) 用於你准備導出的函數,例如可以加入下列宏定義:
#ifdef ROOTERLIB_EXPORTS
#define ROOTERLIB_API __declspec(dllexport)
#else
#define ROOTERLIB_API __declspec(dllimport)
#endif
然后,在定義類的時候,使用宏定義即可:
class ROOTERLIB_API CRooterLib
{
public:
CRooterLib(void);
double SquareRoot(double v);
private:
};
(2). 在WinRT DLL工程屬性中要確保“Windows Store App Support”屬性設置正確,Win32 dll工程中是No,而WinRT DLL中則是Yes:

(3). 創建WinRT DLL工程時,默認情況下是不支持WinRT API以及C++ /CX的,如果需要支持則需要進行如下改動:

注意當這里追加/ZW屬性后,則一定要把/GM項去掉:

(4).在編譯時,要注意WinRT DLL,WinRT組件,Windows Store App,三者之間的編譯平台要保持一致,否則會編譯通不過:
