gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:57:52 26 4
gpt4 key购买 nike

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

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

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

最佳答案

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

我遵循的过程记录在案here .

这是一个概述

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

关于图像信息,可以称之为字节数组。它必须使用 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

关于c# - 从 C++ 非托管应用程序检索 C# .NET 镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18153307/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com