首页 > 解决方案 > 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#swig

解决方案


最后我得到了一个替代解决方案。在回调中,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.
    }
}

推荐阅读