Mercurial > hg > vboxdotnet
annotate InteropCodeGen/ComInteropInterfaceGenerator.cs @ 7:a7650e26195f default tip
Added support for generating Com Callable Wrappers
author | Ivo Smits |
---|---|
date | Fri, 06 May 2011 08:12:43 +0200 |
parents | e640ca67b819 |
children |
rev | line source |
---|---|
6
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
1 ???using System; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
2 using System.Collections.Generic; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
3 using System.Text; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
4 using System.IO; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
5 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
6 namespace VBoxSDK { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
7 class ComInteropInterfaceGenerator { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
8 public TextWriter Output { get; private set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
9 public Boolean IncludeInheritedMembers { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
10 public Boolean IncludeComAttributes { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
11 public Boolean ComInterfaceTypeIDispatch { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
12 public String TypeModifiers { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
13 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
14 public ComInteropInterfaceGenerator(TextWriter output) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
15 Output = output; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
16 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
17 public void WriteLibrary(LibraryInfo lib) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
18 foreach (KeyValuePair<String, EnumInfo> enumi in lib.Enums) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
19 Output.WriteLine("{1} enum {0} {{", enumi.Key, TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
20 foreach (KeyValuePair<String, Int32> value in enumi.Value.Values) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
21 Output.WriteLine("{0} = {1},", value.Key, value.Value); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
22 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
23 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
24 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
25 foreach (KeyValuePair<String, InterfaceInfo> intf in lib.Interfaces) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
26 if (IncludeComAttributes) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
27 if (ComInterfaceTypeIDispatch) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
28 Output.WriteLine("[InterfaceType(ComInterfaceType.InterfaceIsDual)]"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
29 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
30 Output.WriteLine("[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
31 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
32 Output.WriteLine("[Guid(\"{0}\")]", intf.Value.IID); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
33 Output.WriteLine("[ComImport()]"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
34 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
35 Output.Write("{1} interface {0} ", intf.Key, TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
36 if (intf.Value.Extends != null) Output.Write(": {0} ", intf.Value.Extends.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
37 Output.WriteLine("{"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
38 WriteInterfaceMembers(intf.Value); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
39 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
40 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
41 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
42 public void WriteInterfaceMembers(InterfaceInfo intf) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
43 if (IncludeInheritedMembers && intf.Extends != null && intf.Extends.Name != "IUnknown") WriteInterfaceMembers(intf.Extends); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
44 WriteInterfaceMembers(intf.Members); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
45 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
46 public void WriteInterfaceMembers(ICollection<InterfaceMemberInfo> members) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
47 foreach (InterfaceMemberInfo member in members) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
48 if (member is PropertyInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
49 PropertyInfo memberi = (PropertyInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
50 if (!memberi.Gettable && !memberi.Settable) continue; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
51 Output.WriteLine("{0} {1} {{", memberi.Type.Name, memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
52 if (memberi.Gettable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
53 if (IncludeComAttributes) Output.Write("[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
54 if (IncludeComAttributes) WriteTypeComMarshalAttributes(memberi.Type, "return"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
55 Output.WriteLine("get;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
56 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
57 if (memberi.Settable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
58 if (IncludeComAttributes) Output.Write("[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
59 if (IncludeComAttributes) WriteTypeComMarshalAttributes(memberi.Type, "param"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
60 Output.WriteLine("set;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
61 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
62 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
63 } else if (member is MethodInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
64 MethodInfo memberi = (MethodInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
65 if (IncludeComAttributes) Output.Write("[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
66 if (memberi.ReturnType == null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
67 Output.Write("void "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
68 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
69 if (IncludeComAttributes) WriteTypeComMarshalAttributes(memberi.ReturnType, "return"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
70 Output.Write("{0} ", memberi.ReturnType.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
71 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
72 Output.Write("{0}(", memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
73 Boolean first = true; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
74 foreach (MethodParameterInfo param in memberi.Parameters) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
75 if (first) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
76 first = false; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
77 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
78 Output.Write(", "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
79 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
80 if (IncludeComAttributes) WriteTypeComMarshalAttributes(param.Type, null); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
81 if (param.Output && !param.Input) Output.Write("out "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
82 else if (param.Reference) Output.Write("ref "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
83 Output.Write("{0} p{1}", param.Type.Name, param.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
84 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
85 Output.WriteLine(");"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
86 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
87 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
88 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
89 public void WriteTypeComMarshalAttributes(TypeInfo type, String paramType) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
90 String MarshalAs = null; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
91 if (type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
92 MarshalAs = "Interface"; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
93 } else if (type is StringTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
94 MarshalAs = (type as StringTypeInfo).UnmanagedType.ToString(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
95 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
96 if (MarshalAs != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
97 Output.Write("["); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
98 if (paramType != null) Output.Write("{0}: ", paramType); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
99 Output.Write("MarshalAs(UnmanagedType.{0})] ", MarshalAs); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
100 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
101 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
102 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
103 } |