Swig:如何将生成的 C# classes 的可访问性从 `public class` 更改为 `internal class`

Swig: How to change the accessiblity of the generated C# classes from `public class` to `internal class`

我正在使用 swig 4。0.x 包装一个 c++ 文件。

一切正常,除了我想将生成的 C# classes 的可访问性从 public class 更改为 internal class

到目前为止,我尝试过的是: 在 swig 接口文件中

%module example

%{
    #include "include/exampleapi.h"
%}

%typemap(csclassmodifiers) SWIGTYPE "internal class"
%pragma(csharp) moduleclassmodifiers="internal class"

%include <windows.i>
%include "include/exampleapi.h"

以上代码似乎适用于模块 class (example) 和其他一些文件。但它并没有改变所有生成的 classes.

的可访问性修饰符

特别是名称以 public class SWIGTYPE_xxx 开头的 classes(可能称为代理 classes?这些 classes 包含 internal members 并且有一个private 类型为 private global::System.Runtime.InteropServices.HandleRef) 的成员。

如何制作它们internal class

好的,所以我在 swig github 存储库上问了这个问题后就明白了。以下是对 William Fulton 的礼貌回答:

SWIGTYPE_xxx class 称为 Type Wrapper Classes.

您需要将 C 类型用于导致生成类型包装器 class 的类型映射。例如 SWIGTYPE_p_int 包装了一个 int *。因此你会使用:

%typemap(csclassmodifiers) int * "internal class"

所有生成的代理和类型包装器的默认值 classes 来自 csharp.swg:

%typemap(csclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class"

因此只需覆盖这些类型映射以提供您的自定义代码并阅读文档中有关类型映射的章节。