SWIG 和 C#:插入空 C# class

SWIG and C#: insert empty C# class

有没有办法(typemap 或 pragma)将自定义 C# class 插入到生成的 C# 代码中?使用 %typemap(cscode) 将代码添加到包装的 C++ classes 很容易 - 但添加 C# classes...

不清楚

例如,用于创建自定义异常的 SWIG doc 表示:

除了手工制作外,还必须使用上面的样板代码CustomApplicationException:

// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
  public CustomApplicationException(string message) 
    : base(message) {
  }
}

但是不清楚如何通过接口文件添加class

有一个已记录的 pragma 接近您想要的,%pragma(csharp) imclasscode。这会将代码插入到生成的 modulePINVOKE.cs 文件中。

在 SWIG 的源代码树中我们发现:

  /* -----------------------------------------------------------------------------
   * pragmaDirective()
   *
   * Valid Pragmas:
   * imclassbase            - base (extends) for the intermediary class
   * imclassclassmodifiers  - class modifiers for the intermediary class
   * imclasscode            - text (C# code) is copied verbatim to the intermediary class
   * imclassimports         - import statements for the intermediary class
   * imclassinterfaces      - interface (implements) for the intermediary class
   *
   * modulebase              - base (extends) for the module class
   * moduleclassmodifiers    - class modifiers for the module class
   * modulecode              - text (C# code) is copied verbatim to the module class
   * moduleimports           - import statements for the module class
   * moduleinterfaces        - interface (implements) for the module class
   *
   * ----------------------------------------------------------------------------- */

  virtual int pragmaDirective(Node *n) {

因此,假设您对以下嵌套 class 感到满意:

%module test

%pragma(csharp) modulecode=%{
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
  public CustomApplicationException(string message)
    : base(message) {
  }
}
%}

在 module.cs 中完全符合您的要求。如果这还不够,那么我们将不得不开始寻找解决方法,并且在 SWIG 之外(但在同一源代码树中)手动编写小的独立代码块可能会变得更清晰、更简单。


如果您真的想进入解决方法领域,您可以(滥用)使用模块class修饰符编译指示将内容插入全局命名空间,例如:

%module test

%pragma(csharp) moduleclassmodifiers=%{
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
  public CustomApplicationException(string message)
    : base(message) {
  }
}

public class%}

产生test.cs:

using System;
using System.Runtime.InteropServices;


// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
  public CustomApplicationException(string message)
    : base(message) {
  }
}

public class test {
}