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

标签 c# c++ swig

当使用 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%renameItemChanged 设为私有(private)/ protected ,以隐藏默认的包装版本被生成。一旦隐藏起来。

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

这是迄今为止解决问题的最干净的方法 - 能够将代码直接注入(inject)生成的代码的唯一方法是作为参数/返回值编码的一部分 - 设置传入的参数,在返回值之后进行清理或处理返回值。弄乱这些类型映射之一来注入(inject)一些代码会相当困惑。

关于c# - 使用 Swig 为 C++ 代码构建 C# 包装器时,是否可以向现有方法添加代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11286913/

相关文章:

c# - 为什么我的代码块没有在 SandcaSTLe 帮助文件中呈现?

c++ - 在 int 返回函数中返回 "false"

python - SWIG "out"类型映射返回地址而不是数据

c++ - 数组枚举和输入

PHP 7.2.25 错误!= 错误?

java - 如何在 Swig 中为非原始数据类型创建包装器?

c# - 你如何从 Jenkins 运行 NUnit 测试?

c# - 如何在第一次打开应用程序时只启动一次页面?

c# - 从 Azure Blob 存储容器获取最新文件夹

c++ - 如何分别在R和C++中做两个矩阵的矩阵乘积