将代码添加到 SWIG 中自动生成的类

Posted

技术标签:

【中文标题】将代码添加到 SWIG 中自动生成的类【英文标题】:Add code to automatically generated class in SWIG 【发布时间】:2014-11-17 16:04:52 【问题描述】:

我正在尝试找到一种将代码添加到 swig 生成函数的方法。我使用类型映射来扩展类,但在文档中找不到任何关于扩展特定功能的内容。

给定以下 swig 接口文件:

%module Test
%
#include "example.h"
%

%typemap(cscode) Example %
    bool 64bit = SizeOf(typeof(System.IntPtr)) == 8;
    static string Path = 64bit ? "/...Path to 64 bit dll.../" : 
                                 "/...Path to 32 bit dll.../";
%

%include "example.h"

我得到以下 C# 代码:

public class MyClass : global::System.IDisposable 
    ...
    bool 64bit = SizeOf(typeof(System.IntPtr)) == 8;
    static string Path = 64bit ? "/...Path to 64 bit dll.../" : 
                                 "/...Path to 32 bit dll.../";

    ...
    public static SomeObject Process(...)      // Function defined in example.h
                                               <- I would like to add some code here.
        SomeObject ret = new SomeObject(...);

    
    ...

我想向函数 Process 添加一些代码,该代码是对 SetDllDirectory(Path) 的调用,它根据平台类型加载正确的 dll。这需要在 Process() 调用中进行。

非常感谢任何帮助!

【问题讨论】:

从未使用过 swig(根据我刚刚搜索的内容),您似乎想在从现有 C++ 源文件进行翻译期间注入 C# 特定代码 (SetDllDirectory())。如果这是正确的,那么我认为您必须重新排列您的 C++ 代码以适应该注入。 EG 在Process() C++ 代码中创建一个存根虚函数调用,一旦进入 C# 领域,您就可以稍后覆盖它。 Is it possible to add code to an existing method when using Swig to build a C# wrapper for C++ code?的可能重复 @PeterM 这就是我想的那种方法,但找不到真正让它发挥作用的方法。 Flexo 提供了一种直接注入 C# 代码的替代方法,我将尝试一下。 【参考方案1】:

您可以使用%typemap(csout) 生成您要查找的代码。不过这有点麻烦,您需要复制一些现有的 SWIGTYPE 类型映射(这是一个通用占位符),可以在 csharp.swg 中找到

例如,给定一个头文件example.h:

struct SomeObject ;

struct MyClass 
  static SomeObject test();
;

然后您可以编写以下 SWIG 接口文件:

%module Test
%
#include "example.h"
%

%typemap(csout,excode=SWIGEXCODE) SomeObject 
    // Some extra stuff here
    $&csclassname ret = new $&csclassname($imcall, true);$excode
    return ret;


%include "example.h"

产生:

public static SomeObject test() 
    // Some extra stuff here
    SomeObject ret = new SomeObject(TestPINVOKE.MyClass_test(), true);
    return ret;

如果您想为所有返回类型生成它,而不仅仅是返回 SomeObject 的东西,您需要为 csout 的所有变体做更多的工作。

【讨论】:

这看起来很棒,谢谢。我会试一试,看看我是否可以一起获得一个工作版本。【参考方案2】:

20.8.7 of the SWIG docs 部分展示了如何使用typemap(cscode) 来扩展生成的类。

【讨论】:

这允许您添加额外的方法,但不能扩展现有方法。 我相信我看到一个帖子使用cscode%ignore%rename 但我现在找不到它...

以上是关于将代码添加到 SWIG 中自动生成的类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SWIG 生成的 Go 包装器中添加导入语句

swig 生成的代码链接到错误的 python 安装

SWIG C++ to Python:生成 Python 列表的子类

将@Generated注释添加到JAXB生成的类中

Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数

Swig csclassmodifiers 不适用于 C 函数的 Module 类