从C++非托管应用程序检索C#.NET映像

本文关键字:检索 NET 映像 应用程序 C++ | 更新日期: 2023-09-27 18:27:09

我正在使用openFrameworks来渲染视频流。OpenFrameworks使用ofImage类,该类将图像存储为ofPixel的向量(存储unsigned char向量)。

我正在使用C#.NET dll来检索每一帧。该库使用Bitmap来返回检索到的帧。到目前为止,我知道C#.NET是在公共语言运行库下运行的。

我的问题是,我可以使用什么.NET工具或功能来通信本机C++代码和托管C#?

从C++非托管应用程序检索C#.NET映像

为了检索图像,我使用了本教程。它彻底解释了如何从非托管代码中使用C#托管库。

我遵循的过程记录在这里。

以下是概述

  • 创建一个C++/CLI项目(Visual Studio的New中的CLR类库项目对话框)
  • 添加对C#dll的引用创建本机类和/或将必要的C#dll功能暴露给原生世界
  • 使用常用方法(__declspec(dllexport)或.def文件)导出它们
  • 将C++/CLI项目生成的.lib添加为本机项目中的链接器输入

关于图像信息,它可以称为字节数组。它必须使用GCHandle固定在托管代码中。以下是一些代码来说明这个概念(免责声明,这个答案是由另一位作者在msdn论坛的原始帖子中提供的):

#include <unordered_map>
using namespace System;
using namespace System::Runtime::InteropServices;
std::unordered_map<void *, void *> dataHandles;
void *getData() {
    array<Byte>^ arr = gcnew array<Byte>(2);
    arr[0] = 'C';
    arr[1] = '#';
    GCHandle handle = GCHandle::Alloc(arr, GCHandleType::Pinned);
    void *data = (void *)handle.AddrOfPinnedObject();
    dataHandles.insert(std::make_pair(data, (void *)GCHandle::ToIntPtr(handle)));
    return data;
}
void releaseData(void *data) {
    auto i = dataHandles.find(data);
    if (i != dataHandles.end())
        GCHandle::FromIntPtr((IntPtr)i->second).Free();
}
#pragma unmanaged
void native() {
    char *data = (char *)getData();
    for (int i = 0; i < 2; i++)
        printf("%c ", data[i]);
    releaseData(data);
}
#pragma managed
int main(array<System::String ^> ^args) {
    native();
    return 0;
}

有关特定Bitmapunsigned char *转换的更多信息,请点击此处