I am using swig 4.0.x to wrap a c++ file.
Everything is working fine except I want to change the accessibility of the generated C# classes from public class to internal class.
So far what I have tried is this: In swig interface file
%module example
%{
#include "include/exampleapi.h"
%}
%typemap(csclassmodifiers) SWIGTYPE "internal class"
%pragma(csharp) moduleclassmodifiers="internal class"
%include <windows.i>
%include "include/exampleapi.h"
The above code seems to work for the module class (example) and some other files. But it is not changing the accessibility modifier of all the generated classes.
Particularly, classes whose name starts with public class SWIGTYPE_xxx (probably known as proxy classes? These classes contain internal members and have a private member with type private global::System.Runtime.InteropServices.HandleRef) .
How do I make them internal class?
Okay, so I have figured it out after asking this question on swig github repository. Following answer courtesy to William Fulton:
SWIGTYPE_xxxclasses are called Type Wrapper Classes.You need to use the C type for the typemap that causes the type wrapper class to be generated. For example
SWIGTYPE_p_intis wrapping anint *. Hence you'd use:%typemap(csclassmodifiers) int * "internal class"The defaults for all generated proxy and type wrapper classes comes from csharp.swg:
%typemap(csclassmodifiers) SWIGTYPE, SWIGTYPE *, SWIGTYPE &, SWIGTYPE &&, SWIGTYPE [], SWIGTYPE (CLASS::*) "public class"So just override these typemaps to provide your customised code and read the chapter on Typemaps in the documentation.