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 &amp;, SWIGTYPE &amp;&amp;, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class"

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

【讨论】:

以上是关于Swig:如何将生成的 C# 类的可访问性从“公共类”更改为“内部类”的主要内容,如果未能解决你的问题,请参考以下文章

C#:为啥我必须在类的变量中使用公共访问修饰符?

SWIG / C#:命名空间和模板

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数

与抽象类的可访问性不一致

将派生类传递给采用 SWIG Python 中的基类的函数

C# 使用不可变集合或减少字段“CreateContactMapping”的可访问性