Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”
Posted
技术标签:
【中文标题】Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”【英文标题】:Swig: How to change the accessiblity of the generated C# classes from `public class` to `internal class` 【发布时间】:2021-12-27 07:11:33 【问题描述】:我正在使用 swig 4.0.x 来包装一个 c++ 文件。
除了我想将生成的 C# 类的可访问性从 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"
上面的代码似乎适用于模块类 (example
) 和其他一些文件。但它并没有改变所有生成类的可访问性修饰符。
特别是名称以public class SWIGTYPE_xxx
开头的类(可能称为代理类?这些类包含internal members
并有一个private
类型为private global::System.Runtime.InteropServices.HandleRef
的成员)。
如何制作internal class
?
【问题讨论】:
【参考方案1】:好的,所以我在 swig github 存储库上提出了这个问题后想通了。以下回答礼貌William Fulton:
SWIGTYPE_xxx
类被称为Type Wrapper Classes。
您需要使用 C 类型的类型映射来生成类型包装类。例如SWIGTYPE_p_int
正在包装int *
。因此你会使用:
%typemap(csclassmodifiers) int * "internal class"
所有生成的代理和类型包装类的默认值来自 csharp.swg:
%typemap(csclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class"
所以只需覆盖这些类型映射以提供您的自定义代码并阅读文档中有关类型映射的章节。
【讨论】:
以上是关于Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”的主要内容,如果未能解决你的问题,请参考以下文章