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

时间:2013-08-09 18:29:48

标签: c# c++ .net unmanaged openframeworks

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

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

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

2 个答案:

答案 0 :(得分:3)

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

我遵循的流程记录在案here

以下是概述

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

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

#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 *转化here

的详细信息

答案 1 :(得分:0)

Google上的快速搜索转为:Calling a C# function from a C++ DLL,请在提问之前进行搜索。

此外,如果您的C ++应用程序使用C ++ / CLI,您应该可以直接使用C#DLL。