1

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

我正在使用 C# .NET dll 来检索每一帧。该库用于Bitmap返回检索到的帧。到目前为止,我知道 C# .NET 在Common Language Runtime下工作。

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

4

1 回答 1

4

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

我遵循的过程记录在这里

这是一个概述

  • 创建 C++/CLI 项目(Visual Studio 的新建项目对话框中的 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;
}

更多关于特定Bitmap转换unsigned char *here

于 2013-10-03T21:37:33.097 回答