Dot-Net

可以使用 C++/CLI 從本機 C++ 應用程序呼叫 .NET 程式碼嗎?

  • March 23, 2018

我已經用 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 中,儘管除非您希望能夠單獨修補它,否則這樣做幾乎沒有附加價值。

引用自:https://stackoverflow.com/questions/1058897