2

当使用 Swig 包装 C++ 代码时,可以使用%extend. 可以使用. _%typemap(cscode)

如果包装类中已经存在方法,有没有办法添加额外的代码行?

例如,我的 C# 包装器方法如下所示:

  public void ItemChanged(CollectionObject collectionObject, string propertyName) {
    mynamespacePINVOKE.mynamespace_DataObjectCollection_ItemChanged(swigCPtr, CollectionObject.getCPtr(collectionObject), propertyName);
    if (mynamespacePINVOKE.SWIGPendingException.Pending) throw mynamespacePINVOKE.SWIGPendingException.Retrieve();
  }

我想添加一行代码:

  public void ItemChanged(CollectionObject collectionObject, string propertyName) {
    mynamespacePINVOKE.mynamespace_DataObjectCollection_ItemChanged(swigCPtr, CollectionObject.getCPtr(collectionObject), propertyName);
    if (mynamespacePINVOKE.SWIGPendingException.Pending) throw mynamespacePINVOKE.SWIGPendingException.Retrieve();
    **insert my line of code here**
  }
4

1 回答 1

2

为了编写自己的版本,您需要确保它不会与默认版本冲突。我认为最简单的方法是ItemChanged使用私有/受保护%csmethodmodifiers%rename隐藏生成的默认包装版本。一旦隐藏。

ItemChanged然后,您可以安全地使用 cscode 类型映射编写自己的版本,该类型映射首先调用私有版本,然后根据需要调用您的附加代码。

这是迄今为止解决问题的最干净的方法 - 能够将代码直接注入生成的代码的唯一方法是作为参数/返回值编组的一部分 - 设置传入的参数,然后清理或处理返回值。使用其中一种类型映射来注入一些代码会相当混乱。

于 2012-07-02T16:17:05.913 回答