.net - C++/CLI 能否用于从 native C++ 应用程序调用 .NET 代码?

标签 .net c++ interop c++-cli

<分区>

我已经用 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/

相关文章:

c# - .NET 4 中的 StackOverflowException

c# - 自动属性和不可变类型

c++ - C++问题新删除

c++ - 为什么当我从两个角度的和本身显示为 180 时减去 180 时得到错误答案?

.net - web.config 转换 : Add XML comment to indicate which configuration was used

.net - 在 MVC3 中排序时出现 "Cannot perform runtime binding on a null reference"错误

c++ - 分离复制/move 赋值运算符

.net - 为什么当用户放大 Excel 时 WinForms 控件被禁用?

C#控制数据的对齐方式

c# - 如何创建 SendMessage WM_KEYDOWN 的 lParam