当使用 Swig 包装 C++ 代码时,可能 add methods to the native C++ type使用%extend
。有可能 add methods to the C# wrapper class使用%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**
}
最佳答案
为了编写您自己的版本,您需要确保它不会与默认版本发生冲突。我认为最简单的方法是使用 %csmethodmodifiers
和 %rename
将 ItemChanged
设为私有(private)/ protected ,以隐藏默认的包装版本被生成。一旦隐藏起来。
然后,您可以使用 cscode 类型映射安全地编写您自己的 ItemChanged
版本,该类型映射首先调用私有(private)版本,然后根据需要调用其他代码。
这是迄今为止解决问题的最干净的方法 - 能够将代码直接注入(inject)生成的代码的唯一方法是作为参数/返回值编码的一部分 - 设置传入的参数,在返回值之后进行清理或处理返回值。弄乱这些类型映射之一来注入(inject)一些代码会相当困惑。
关于c# - 使用 Swig 为 C++ 代码构建 C# 包装器时,是否可以向现有方法添加代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11286913/