将代码添加到 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 C++ to Python:生成 Python 列表的子类