Dot-Net
可以使用 C++/CLI 從本機 C++ 應用程序呼叫 .NET 程式碼嗎?
我已經用 C++/CLI 做了相反的事情(從 .NET 呼叫純 C++ 程式碼),並且它工作(大部分)。
本機到 C++/CLI 方向是如何完成的?
我真的不想使用 COM 互操作…
您始終可以在本機應用程序中託管 CLR。
如果您有一個現有的本機 C++ 應用程序並希望避免使用過多的 CLR 內容“污染”它,您可以
/clr只為一個特定文件打開標誌並使用標準 C++ 標頭為其提供介面。我已經用一段舊程式碼做到了這一點。在標題中我有:void SaveIconAsPng(void *hIcon, const wchar_t *pstrFileName);所以程序的其餘部分有一個簡單的 API,它可以傳遞一個 HICON 和一個目標文件路徑。
然後我有一個單獨的源文件,它是唯一
/clr打開的源文件:using namespace System; using namespace System::Drawing; using namespace System::Drawing::Imaging; using namespace System::Drawing::Drawing2D; #include <vcclr.h> #include <wchar.h> void SaveIconAsPng(void *hIcon, const wchar_t *pstrFileName) { try { Bitmap bitmap(16, 16, PixelFormat::Format32bppArgb); Graphics ^graphics = Graphics::FromImage(%bitmap); graphics->SmoothingMode = SmoothingMode::None; Icon ^icon = Icon::FromHandle(IntPtr(hIcon)); graphics->DrawIcon(icon, Rectangle(0, 0, 15, 15)); graphics->Flush(); bitmap.Save(gcnew String(pstrFileName), ImageFormat::Png); } catch (Exception ^x) { pin_ptr<const wchar_t> unmngStr = PtrToStringChars(x->Message); throw widestring_error(unmngStr); // custom exception type based on std::exception } }這樣我就可以將 HICON 轉換為我毛茸茸的舊 C++ 程序中的 PNG 文件,但我已經將 .NET 框架的使用與其餘程式碼隔離開來——所以如果我以後需要可移植,我可以輕鬆地換成一個不同的實現。
您可以更進一步,將依賴於 CLR 的程式碼放在單獨的 DLL 中,儘管除非您希望能夠單獨修補它,否則這樣做幾乎沒有附加價值。