簡短的回答是可以在同一個項目中使用C++/CX和C++/WinRT。
C++/CX編譯器將Winmd類型注入到根名稱空間中。 C++/WinRT將所有內容封裝在其自己的根winrt名稱空間中,以適應C++/CX的互操作性,並避免與其他庫發生C++編譯器模糊性錯誤。所以,下面的C++/CX代碼:
using namespace Windows::Foundation;
using namespace Windows::Networking;
Uri^uri = ref new Uri(L"https://moderncpp.com/");
HostName^name = ref new HostName(L"moderncpp.com");
可與C++/WinRT中被改寫爲:
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Networking;
Uri uri(L"https://moderncpp.com/");
HostName name(L"moderncpp.com");
另外,如果你使用/ ZW進行編譯,然後可以按照以下方式重寫它(避免錯誤C2872:「視窗」:曖昧的符號):
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Networking;
Uri uri(L"https://moderncpp.com/");
HostName name(L"moderncpp.com");
你可能既包括C++/CX和C++/WinRT中相同的源文件中是使用一個根命名空間既如下另一種方法:
namespace cx
{
using namespace Windows::Foundation;
using namespace Windows::Networking;
}
namespace winrt
{
using namespace Windows::Foundation;
using namespace Windows::Networking;
}
void Sample()
{
cx::Uri uri(L"https://moderncpp.com/");
winrt::HostName name(L"moderncpp.com");
}
在一天結束時,C++/WinRT只是一個標準的C++庫,您可以將其包含到任何適用的C++項目中。不過,C++/CX和C++/WinRT處理元數據的方式非常不同。 C++/CX都直接消耗和生成元數據,而C++/WinRT受標準C++的約束,因此需要一個獨立的工具(cppwinrt.exe)來幫助縮小這個差距。
Hmya,我們不得不看看他過去一年的工作,他沒有更新他的github存儲庫。如果你之前從來沒有充分理由進入WRL,那麼C++/WinRT不太可能旋轉任何螺旋槳。這實際上是什麼,至少現代風格的味道,另一個像WRL的包裝,但更新爲C++ 1xyz。科爾和麥克奈利斯的代碼讓我頭痛,你可以看看它做了什麼,但不容易看出它沒有做什麼。 –
@HansPassant:C++/WinRT(通過C++/CX)的主要原因是性能。編譯時間不是很好,通常錯誤信息是很好的謎語。儘管如此,我還是喜歡簡潔(或者過於簡潔,如果你願意的話)語法,而不是明確的WRL調用(雖然我可能會改變主意,但我必須首次調試真正的問題)。我同意,很難看出,哪些代碼(或不這樣做)。但對於C#/ .NET來說,情況也是如此,並且從來沒有讓它成爲許多人的首選目標。無論如何,個人偏好是個人的,我猜;) – IInspectable
我不是C++專家,但是......爲什麼不呢? C++/CX項目可以有常規的C++代碼,而C++/WinRT只是常規的C++,對吧? –