Получить образ C# .NET из неуправляемого приложения C++

Я использую openFrameworks для рендеринга видеопотока. OpenFrameworks использует класс ofImage, который хранит изображения в виде вектора ofPixel (который хранит вектор unsigned char).

Я использую dll С# .NET для извлечения каждого кадра. Эта библиотека использует Bitmap для возврата полученных кадров. Пока я знаю, что C#.NET работает в Common Language Runtime.

Мой вопрос заключается в том, какие инструменты или функции .NET я могу использовать для передачи собственного кода C++ и управляемого C#?


person Sergio Basurco    schedule 09.08.2013    source источник
comment
Я пытаюсь отредактировать этот вопрос, чтобы он был приемлемым, на момент, когда я его задавал, я ничего не знал о С# или .NET. Мне трудно улучшить качество вопроса. Должен ли я удалить его, так как весь вопрос показывает плохое исследование?   -  person Sergio Basurco    schedule 02.10.2013


Ответы (1)


Чтобы получить изображение, я использовал это руководство . В нем подробно объясняется, как использовать управляемую библиотеку C# из неуправляемого кода.

Процесс, которому я следовал, задокументирован здесь.

Вот обзор

  • создать проект C++/CLI (библиотека классов CLR в диалоговом окне "Новый проект" Visual Studio)
  • добавить ссылку на dll C#, создать собственные классы и/или функции, которые предоставляют необходимые функциональные возможности dll C# в родном мире;
  • экспортируйте их, используя обычные средства (__declspec(dllexport) или файл .def)
  • добавьте .lib, созданный проектом C++/CLI, в качестве входных данных компоновщика в ваш собственный проект (ы)

Информация об изображении может называться массивом байтов. Его необходимо закрепить в управляемом коде с помощью 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 * здесь

person Sergio Basurco    schedule 03.10.2013