You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SWIG中将C/C++的(const uint8_t*, unsigned int)参数转为C# byte[]

需求说明

需要为以下C++代码在C#侧生成使用byte[]作为参数的友好方法签名:

class BytesWriterStrategy
{
public:
    virtual void WriteBytes(const uint8_t* array, unsigned int size) = 0;
};
    
class Base64Strategy final : public BytesWriterStrategy
{
public:
    void WriteBytes(const uint8_t* array, unsigned int size) final;
};

已经实现了Java侧的SWIG typemap,可以将接口转换为Java侧使用byte[]而非SWIG指针的形式,现在需要对应C#侧的typemap实现。

解决方案

直接在你的SWIG接口文件中加入以下typemap配置即可:

// 配置对外暴露的C#方法参数类型
%typemap(cstype) (const uint8_t *array, unsigned int size) "byte[]"
// 配置P/Invoke中间层的参数类型
%typemap(imtype) (const uint8_t *array, unsigned int size) "byte[]"
// C#层调用时直接透传输入数组
%typemap(csin) (const uint8_t *array, unsigned int size) "$csinput"
// 合并两个C++参数为1个输入,自动提取数组指针和长度
%typemap(in, numinputs=1) (const uint8_t *array, unsigned int size) {
    $1 = (uint8_t*)$input;
    $2 = (unsigned int)SZLENGTH($input);
}

// 若需要支持C#侧继承BytesWriterStrategy重写WriteBytes方法(Director特性),添加以下配置
%typemap(csdirectorin) (const uint8_t *array, unsigned int size) "$iminput"
%typemap(directorin) (const uint8_t *array, unsigned int size) {
    $input = SWIG_CSharpNewByteArray((const char*)$1, $2);
}

配置完成后生成的C#代码会得到和Java侧一致的效果,WriteBytes方法仅需要传入一个byte[]类型参数,SWIG会自动完成数组指针、长度和C++接口的映射。

内容的提问来源于stack exchange,提问作者Štefan Bellus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:57:00