c# - SWIG C# 使用 Director =“1”传递二进制数据
问题描述
我看到一个关于如何将director回调中的二进制数据从C++传递到java的java示例,https://github.com/swig/swig/blob/90cdbee6a69d13b39d734083b9f91069533b0d7b/Examples/test-suite/director_binary_string.i,我想使用相同的 swig 指令在 C# 上做同样的事情,
%apply (char *STRING, size_t LENGTH) { (char *dataBufferAA, int sizeAA) };
但它不生效,并显示
Warning 453: Can't apply (char const *STRING,size_t LENGTH). No typemaps are defined
基本上我的代码结构如下所示,我希望void run(byte[] aData)
可以在 C# 中调用类似的回调函数。
%module(directors="1") director_binary_string;
%feature("director") Callback;
%apply (char *STRING, size_t LENGTH) { (char* aData, size_t aLen) };
%inline %{
#include <stdlib.h>
class Callback {
public:
virtual ~Callback() {}
virtual void run(char* aData, size_t aLen) {}
};
%}
我尝试了一个像下面这样的类型图,但它没有按预期工作。
%typemap(imtype) (const char *STRING, size_t LENGTH) "byte[]"
%typemap(cstype) (const char *STRING, size_t LENGTH) "byte[]"
%typemap(directorin, excode=SWIGEXCODE) (const char *STRING, size_t LENGTH) %{
{
$input = new byte[(int)$2];
IntPtr data = $imcall;
System.Runtime.InteropServices.Marshal.Copy(data, $input, 0, (int)$2);
}
%}
任何人都可以展示如何编写正确的类型图或任何其他更好的解决方案。
解决方案
最后我得到了一个替代解决方案。在回调中,C# 的调用者主动检索二进制数据,而不是从 C++ 将二进制数据传递到 C# 端。例如
痛饮界面
%module(directors="1") director_binary_string;
%feature("director") Callback;
%include "arrays_csharp.i"
%inline %{
#include <stdlib.h>
class CallbackData
{
public:
%apply unsigned char INOUT[] { unsigned char* aBlockData}
bool GetBlockData(unsigned char* aBlockData);
size_t GetSize();
};
class Callback {
public:
virtual ~Callback() {}
virtual void run(CallbackData aCB) {}
};
C#
class csharp_callback : Callback
{
public override void run(CallbackData aCB)
{
byte[] aData = new byte[aCB.GetSize()];
aCB.GetBlockData(aData);
//aData is the expected binary data.
}
}
推荐阅读
- mongodb - 如何通过 MongoDB Compass 或 RoboMongo 等 UI 工具连接运行在 Kubernetes 集群上的 MongoDB?
- python - TensorFlow 环境未激活
- python-3.x - 如何拆分 json 有效负载并触发 POST 请求
- nginx - Heroku + nginx-buildpack
- azure - Azure 数据工厂管道日志
- android - 如何调用主要活动中的片段以通过图像播放视频
- javascript - 避免在输入元素中输入,在 JavaScript 中除了英文字母之外的任何内容
- c# - 如何使用 C# 在 asp.net 中加密和验证密码?
- javascript - 在 HTML 端从 Javascript 呈现项目时传递正确的信息
- swift - Swift:按属性对列表对象进行排序