C# attribute support added - %csattributes feature, %csattributes typemap
and inattributes & outattributes typemap attributes for the imtype and cstype typemaps. Links to external documentation on interop added. git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@7185 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
43a6363856
commit
a3d9903d5f
1 changed files with 107 additions and 1 deletions
|
|
@ -38,6 +38,12 @@ Swig C# works equally well on non-Microsoft operating systems such as Linux, Sol
|
||||||
<a href="http://www.mono-project.com/">Mono</a> and <a href="http://www.dotgnu.org/pnet.html">Portable.NET</a>.
|
<a href="http://www.mono-project.com/">Mono</a> and <a href="http://www.dotgnu.org/pnet.html">Portable.NET</a>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
To get the most out of this chapter an understanding of interop is required.
|
||||||
|
The <a href="http://msdn.microsoft.com">Microsoft Developer Network (MSDN)</a> has a good reference guide in a section titled "Interop Marshaling".
|
||||||
|
Monodoc, available from the Mono project, has a very useful section titled <a href="http://www.mono-project.com/Interop_with_Native_Libraries">Interop with native libraries</a>.
|
||||||
|
</p>
|
||||||
|
|
||||||
<H2><a name="csharp_differences_java"></a>16.2 Differences to the Java module</H2>
|
<H2><a name="csharp_differences_java"></a>16.2 Differences to the Java module</H2>
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -128,6 +134,7 @@ javadestruct_derived -> csdestruct_derived
|
||||||
<div class="code"><pre>
|
<div class="code"><pre>
|
||||||
csvarin C# code property set typemap
|
csvarin C# code property set typemap
|
||||||
csvarout C# code property get typemap
|
csvarout C# code property get typemap
|
||||||
|
csattributes C# attributes for attaching to proxy classes/enums
|
||||||
</pre></div>
|
</pre></div>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
@ -171,7 +178,7 @@ The intermediary classname has <tt>PINVOKE</tt> appended after the module name i
|
||||||
<li>
|
<li>
|
||||||
<p>
|
<p>
|
||||||
Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional <tt>out</tt> attribute which is used for output types.
|
Support for asymmetric type marshalling. The 'ctype', 'imtype' and 'cstype' typemaps support an optional <tt>out</tt> attribute which is used for output types.
|
||||||
If this typemap attribute is specified, then the type specified in the attribute is used for output types.
|
If this typemap attribute is specified, then the type specified in the attribute is used for output types and
|
||||||
the type specified in the typemap itself is used for the input type.
|
the type specified in the typemap itself is used for the input type.
|
||||||
If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap.
|
If this typemap attribute is not specified, then the type used for both input and output is the type specified in the typemap.
|
||||||
An example shows that <tt>char *</tt> could be marshalled in different ways,
|
An example shows that <tt>char *</tt> could be marshalled in different ways,
|
||||||
|
|
@ -196,6 +203,105 @@ public static extern IntPtr function(string jarg1);
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
Support for type attributes.
|
||||||
|
The 'imtype' and 'cstype' typemaps can have an optional <tt>inattributes</tt> and <tt>outattributes</tt> typemap attribute.
|
||||||
|
There are C# attributes and typemap attributes, don't get confused!!
|
||||||
|
The C# attributes specified in these typemap attributes are generated wherever the type is used in the C# wrappers.
|
||||||
|
These can be used to specify any C# attribute associated with a C/C++ type, but are more typically used for the C# <tt>MarshalAs</tt> attribute.
|
||||||
|
For example:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="code">
|
||||||
|
<pre>
|
||||||
|
%typemap(imtype,
|
||||||
|
inattributes="[MarshalAs(UnmanagedType.LPStr)]",
|
||||||
|
outattributes="[return: MarshalAs(UnmanagedType.LPStr)]") const char * "String"
|
||||||
|
|
||||||
|
const char * GetMsg() {}
|
||||||
|
void SetMsg(const char *msg) {}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The intermediary class will then have the marshalling as specified by everything in the 'imtype' typemap:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="code">
|
||||||
|
<pre>
|
||||||
|
class examplePINVOKE {
|
||||||
|
...
|
||||||
|
[DllImport("example", EntryPoint="CSharp_GetMsg")]
|
||||||
|
[return: MarshalAs(UnmanagedType.LPStr)]
|
||||||
|
public static extern String GetMsg();
|
||||||
|
|
||||||
|
[DllImport("example", EntryPoint="CSharp_SetMsg")]
|
||||||
|
public static extern void SetMsg([MarshalAs(UnmanagedType.LPStr)]String jarg1);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Note that the <tt>DllImport</tt> attribute is always generated, irrespective of any additional attributes specified.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
These attributes are associated with the C/C++ parameter type or return type, which is subtely different to
|
||||||
|
the attribute features and typemaps covered next.
|
||||||
|
Note that all these different C# attributes can be combined so that a method has more than one attribute.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<p>
|
||||||
|
Support for attaching C# attributes to wrapped methods and variables.
|
||||||
|
This is done using the <tt>%csattributes</tt> feature, see <a href="Customization.html#features">%feature directives</a>.
|
||||||
|
Note that C# attributes are attached to proxy classes and enums using the <tt>csattributes</tt> typemap.
|
||||||
|
For example, imagine we have a custom attribute class, <tt>ThreadSafeAttribute</tt>, for labelling thread safety.
|
||||||
|
The following SWIG code shows how to attach this C# attribute to some methods and the class declaration itself:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="code">
|
||||||
|
<pre>
|
||||||
|
%typemap(csattributes) AClass "[ThreadSafe]"
|
||||||
|
%csattributes AClass::AClass(double d) "[ThreadSafe(false)]"
|
||||||
|
%csattributes AClass::AMethod() "[ThreadSafe(true)]"
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
class AClass {
|
||||||
|
public:
|
||||||
|
AClass(double a) {}
|
||||||
|
void AMethod() {}
|
||||||
|
};
|
||||||
|
%}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
will generate a C# proxy class:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="code">
|
||||||
|
<pre>
|
||||||
|
[ThreadSafe]
|
||||||
|
public class AClass : IDisposable {
|
||||||
|
...
|
||||||
|
[ThreadSafe(false)]
|
||||||
|
public AClass(double a) ...
|
||||||
|
|
||||||
|
[ThreadSafe(true)]
|
||||||
|
public void AMethod() ...
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If C# attributes need adding to the <tt>set</tt> or <tt>get</tt> part of C# properties, when wrapping C/C++ variables,
|
||||||
|
they can be added using the 'csvarin' and 'csvarout' typemaps respectively.
|
||||||
|
</p>
|
||||||
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue