使用Swig为C++代码构建C#包装时,是否可以将代码添加到现有方法?

问题描述:

使用Swig包装C++代码时,可能使用使用%extend。有可能0123'使用%typemap(cscode)使用Swig为C++代码构建C#包装时,是否可以将代码添加到现有方法?

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

例如,我的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** 
    } 

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

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

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