从C++非托管应用程序检索C#.NET映像
Retrieve C# .NET image from C++ unmanaged application
我正在使用openFrameworks来渲染视频流。OpenFrameworks使用ofImage
类,该类将图像存储为ofPixel
的向量(存储unsigned char
向量)。
我正在使用C#.NET dll来检索每一帧。该库使用Bitmap
来返回检索到的帧。到目前为止,我知道C#.NET是在公共语言运行库下运行的。
我的问题是,我可以使用什么.NET工具或功能来通信本机C++代码和托管C#?
为了检索图像,我使用了本教程。它彻底解释了如何从非托管代码中使用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;
}
有关特定Bitmap
到unsigned char *
转换的更多信息,请点击此处
相关文章:
- 使用VerQueryValue检索应用程序的文件描述
- 是否可以从格式字符串中检索"width"
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在 C++/CLI 中将 .NET 事件从一个 DLL 引发到另一个 DLL
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- 如何在Qt中从数据库中检索二进制数据?
- 如何从C++代码中检索 QML 的文本字段中的文本?
- 从 opencv c++ 中的矢量中检索固定的帧数
- 是否可以在Linux上使用.Net Core 3.1创建C++/CLI代码的C#DLL
- 如何在不等待检索的情况下获取C++中的内存位置?
- 如何在 QTreeWidget 中检索特定项目的 mimeData?
- C++从字符串中检索几行
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- C++ DLL(不是 CLI)是否可以调用 .NET Core 3.0 委托?
- System.AccessViolationException:shared_ptr C# .NET 和 C++ 应用程
- 在数据库中插入和检索矩阵
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 从C++非托管应用程序检索C#.NET映像