Swig:如何将生成的C#类的可访问性从"public class"更改为"interna



我正在使用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 global::System.Runtime.InteropServices.HandleRefprivate成员(。

如何使它们成为internal class

好的,所以我在swig-github存储库上问了这个问题后就明白了。以下回答由William Fulton提供:

SWIGTYPE_xxx类称为类型包装类。

您需要为导致生成类型包装类的类型映射使用C类型。例如,SWIGTYPE_p_int正在包装int *。因此,您将使用:

%typemap(csclassmodifiers) int * "internal class"

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

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

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

最新更新