SWIG C# 使用 directors="1" 传递二进制数据
SWIG C# Passing binary data with directors="1"
我看到一个 java 示例,关于如何将 director 回调中的二进制数据从 C++ 传递到 java , https://github.com/swig/swig/blob/90cdbee6a69d13b39d734083b9f91069533b0d7b/Examples/test-suite/director_binary_string.i ,我想在 C# 上做同样的事情相同的 swig 指令,
%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
基本上我的代码结构如下所示,我希望可以在 C# 中调用像 void run(byte[] aData)
这样的回调函数。
%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)];
IntPtr data = $imcall;
System.Runtime.InteropServices.Marshal.Copy(data, $input, 0, (int));
}
%}
任何人都可以展示如何编写正确的类型映射或任何其他更好的解决方案。
终于找到了替代方案。在回调中,C# 的调用者主动检索二进制数据,而不是将二进制数据从 C++ 传递到 C# 端。例如
Swig 界面
%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.
}
}
我看到一个 java 示例,关于如何将 director 回调中的二进制数据从 C++ 传递到 java , https://github.com/swig/swig/blob/90cdbee6a69d13b39d734083b9f91069533b0d7b/Examples/test-suite/director_binary_string.i ,我想在 C# 上做同样的事情相同的 swig 指令,
%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
基本上我的代码结构如下所示,我希望可以在 C# 中调用像 void run(byte[] aData)
这样的回调函数。
%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)];
IntPtr data = $imcall;
System.Runtime.InteropServices.Marshal.Copy(data, $input, 0, (int));
}
%}
任何人都可以展示如何编写正确的类型映射或任何其他更好的解决方案。
终于找到了替代方案。在回调中,C# 的调用者主动检索二进制数据,而不是将二进制数据从 C++ 传递到 C# 端。例如
Swig 界面
%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.
}
}