<分区>
我已经用 C++/CLI 完成了另一种方法(从 .NET 调用纯 C++ 代码),并且它(在大多数情况下)有效。
native 到 C++/CLI 方向是如何完成的?
我真的不想使用 COM 互操作...
<分区>
我已经用 C++/CLI 完成了另一种方法(从 .NET 调用纯 C++ 代码),并且它(在大多数情况下)有效。
native 到 C++/CLI 方向是如何完成的?
我真的不想使用 COM 互操作...
最佳答案
如果您有一个现有的 native C++ 应用程序并希望避免使用过多的 CLR 内容“污染”它,您可以仅为一个特定文件打开 /clr
标志并使用标准 C++ header 为其提供接口(interface)。我已经用一段旧代码完成了这个。在标题中我有:
void SaveIconAsPng(void *hIcon, const wchar_t *pstrFileName);
因此程序的其余部分有一个简单的 API,它可以将 HICON 和目标文件路径传递给该 API。
然后我有一个单独的源文件,这是唯一打开了 /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 转换成 PNG 文件,从我毛茸茸的旧 C++ 程序,但我已经将 .NET 框架的使用与其余代码隔离开来——所以如果我以后需要可移植性,我可以很容易地交换不同的实现。
您可以更进一步,将依赖于 CLR 的代码放在一个单独的 DLL 中,尽管这样做的附加值(value)很小,除非您希望能够单独修补它。
关于.net - C++/CLI 能否用于从 native C++ 应用程序调用 .NET 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1058897/