Mercurial > hg > vboxdotnet
annotate InteropCodeGen/ComInteropProxyGenerator.cs @ 6:e640ca67b819
Added extended COM interop code generator for interfaces and proxies
author | Ivo Smits |
---|---|
date | Fri, 06 May 2011 04:02:43 +0200 |
parents | |
children | a7650e26195f |
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 ComInteropProxyGenerator { |
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 String TypeModifiers { get; set; } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
11 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
12 public ComInteropProxyGenerator(TextWriter output) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
13 Output = output; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
14 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
15 public void WriteLibrary(LibraryInfo lib) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
16 Output.WriteLine("interface IComProxy {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
17 Output.WriteLine("IntPtr ComPointer { get; }"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
18 Output.WriteLine("void AddRef();"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
19 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
20 foreach (KeyValuePair<String, InterfaceInfo> intf in lib.Interfaces) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
21 WriteInterface(intf.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 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
24 public void WriteInterface(InterfaceInfo intf) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
25 /*List<InterfaceMemberInfo> members = new List<InterfaceMemberInfo>(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
26 InterfaceInfo intfp = intf.Value; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
27 while (intfp != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
28 members.AddRange(intfp.Members); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
29 intfp = intfp.Extends; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
30 }*/ |
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 foreach (InterfaceMemberInfo member in intf.Members) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
33 if (member is PropertyInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
34 PropertyInfo memberi = (PropertyInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
35 if (memberi.Gettable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
36 Output.Write("{2} delegate HRESULT {0}_{1}_get_Delegate(IntPtr pThis, ", intf.Name, memberi.Name, TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
37 if (memberi.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
38 Output.WriteLine("out IntPtr value);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
39 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
40 WriteTypeComMarshalAttributes(memberi.Type, null); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
41 Output.WriteLine("out {0} value);", memberi.Type.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
42 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
43 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
44 if (memberi.Settable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
45 Output.Write("{2} delegate HRESULT {0}_{1}_set_Delegate(IntPtr pThis, ", intf.Name, memberi.Name, TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
46 if (memberi.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
47 Output.WriteLine("IntPtr value);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
48 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
49 WriteTypeComMarshalAttributes(memberi.Type, null); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
50 Output.WriteLine("{0} value);", memberi.Type.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
51 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
52 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
53 } else if (member is MethodInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
54 MethodInfo memberi = (MethodInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
55 Output.Write("{0} delegate ", TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
56 Output.Write("HRESULT "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
57 Output.Write("{0}_{1}_Delegate(IntPtr mThis", intf.Name, memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
58 foreach (MethodParameterInfo param in memberi.Parameters) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
59 Output.Write(", "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
60 if (param.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
61 if (param.Output && !param.Input) Output.Write("out "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
62 else if (param.Reference) Output.Write("ref "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
63 Output.Write("IntPtr p{0}", param.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
64 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
65 WriteTypeComMarshalAttributes(param.Type, null); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
66 if (param.Output && !param.Input) Output.Write("out "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
67 else if (param.Reference) Output.Write("ref "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
68 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
|
69 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
70 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
71 if (memberi.ReturnType != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
72 Output.Write(", "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
73 if (memberi.ReturnType is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
74 Output.Write("out IntPtr mOut"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
75 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
76 WriteTypeComMarshalAttributes(memberi.ReturnType, null); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
77 Output.Write("out {0} mOut", memberi.ReturnType.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
78 } |
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 Output.WriteLine(");"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
81 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
82 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
83 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
84 Output.WriteLine("{1} struct {0}_vtable {{", intf.Name, TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
85 if (intf.Extends != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
86 Output.WriteLine("public {0}_vtable {0};", intf.Extends.Name); |
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 foreach (InterfaceMemberInfo member in intf.Members) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
89 if (member is PropertyInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
90 PropertyInfo memberi = (PropertyInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
91 if (memberi.Gettable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
92 Output.WriteLine("[MarshalAs(UnmanagedType.FunctionPtr)] public {0}_{1}_get_Delegate get_{1};", intf.Name, memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
93 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
94 if (memberi.Settable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
95 Output.WriteLine("[MarshalAs(UnmanagedType.FunctionPtr)] public {0}_{1}_set_Delegate set_{1};", intf.Name, memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
96 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
97 } else if (member is MethodInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
98 MethodInfo memberi = (MethodInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
99 Output.WriteLine("[MarshalAs(UnmanagedType.FunctionPtr)] public {0}_{1}_Delegate {1};", intf.Name, memberi.Name); |
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 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
103 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
104 Output.WriteLine("{1} unsafe class {0}_Proxy : IComProxy, {0} {{", intf.Name, TypeModifiers); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
105 Output.WriteLine("public static Guid IID = new Guid(\"{0}\");", intf.IID); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
106 Output.WriteLine("private IntPtr pointer;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
107 Output.WriteLine("private {0}_vtable functions;", intf.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
108 Output.WriteLine("public {0}_Proxy(IntPtr p) {{", intf.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
109 Output.WriteLine("IUnknown_vtable ft = (IUnknown_vtable)Marshal.PtrToStructure(*(IntPtr*)p, typeof(IUnknown_vtable));"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
110 Output.WriteLine("Guid IIDCopy = IID;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
111 Output.WriteLine("HRESULT hr = ft.QueryInterface(p, ref IIDCopy, out pointer);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
112 Output.WriteLine("Marshal.ThrowExceptionForHR(hr);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
113 //Output.WriteLine("ft.AddRef(p);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
114 Output.WriteLine("functions = ({0}_vtable)Marshal.PtrToStructure(*(IntPtr*)pointer, typeof({0}_vtable));", intf.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
115 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
116 Output.WriteLine("IntPtr IComProxy.ComPointer { get { return pointer; } }"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
117 Output.Write("~{0}_Proxy() {{ functions", intf.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
118 { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
119 InterfaceInfo intfp = intf; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
120 while (intfp.Extends != null && intfp.Name != "IUnknown") { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
121 intfp = intfp.Extends; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
122 Output.Write(".{0}", intfp.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
123 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
124 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
125 Output.WriteLine(".Release(pointer); }"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
126 WriteInterfaceMembers(intf, ""); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
127 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
128 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
129 private void WriteInterfaceMembers(InterfaceInfo intf, String ftprefix) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
130 if (intf.Extends != null) WriteInterfaceMembers(intf.Extends, ftprefix + "." + intf.Extends.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
131 WriteInterfaceMembers(intf.Members, ftprefix); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
132 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
133 private void WriteInterfaceMembers(ICollection<InterfaceMemberInfo> members, String ftprefix) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
134 foreach (InterfaceMemberInfo member in members) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
135 if (member is PropertyInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
136 PropertyInfo memberi = (PropertyInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
137 if (!memberi.Gettable && !memberi.Settable) continue; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
138 Output.WriteLine("public {0} {1} {{", memberi.Type.Name, memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
139 if (memberi.Gettable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
140 Output.WriteLine("get {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
141 if (memberi.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
142 Output.WriteLine("IntPtr value;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
143 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
144 Output.WriteLine("{0} value;", memberi.Type.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
145 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
146 Output.WriteLine("HRESULT hr = functions{1}.get_{0}(pointer, out value);", memberi.Name, ftprefix); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
147 Output.WriteLine("Marshal.ThrowExceptionForHR(hr);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
148 if (memberi.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
149 Output.WriteLine("return value == IntPtr.Zero ? null : new {0}_Proxy(value);", memberi.Type.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
150 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
151 Output.WriteLine("return value;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
152 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
153 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
154 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
155 if (memberi.Settable) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
156 Output.WriteLine("set {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
157 if (memberi.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
158 Output.WriteLine("IntPtr pvalue;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
159 Output.WriteLine("if (pvalue == null) {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
160 Output.WriteLine("pvalue = IntPtr.Zero;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
161 Output.WriteLine("} else if (pvalue is IComProxy) {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
162 Output.WriteLine("((IComProxy)value).AddRef();"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
163 Output.WriteLine("pvalue = ((IComProxy)value).ComPointer;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
164 Output.WriteLine("} else {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
165 Output.WriteLine("pvalue = Marshal.GetIUnknownForObject(value);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
166 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
167 Output.WriteLine("HRESULT hr = functions{1}.set_{0}(pointer, pvalue);", memberi.Name, ftprefix); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
168 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
169 Output.WriteLine("HRESULT hr = functions{1}.set_{0}(pointer, value);", memberi.Name, ftprefix); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
170 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
171 Output.WriteLine("Marshal.ThrowExceptionForHR(hr);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
172 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
173 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
174 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
175 } else if (member is MethodInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
176 MethodInfo memberi = (MethodInfo)member; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
177 Output.Write("public "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
178 if (memberi.ReturnType == null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
179 Output.Write("void"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
180 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
181 Output.Write(memberi.ReturnType.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
182 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
183 Output.Write(" {0}(", memberi.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
184 Boolean first = true; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
185 foreach (MethodParameterInfo parameter in memberi.Parameters) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
186 if (first) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
187 first = false; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
188 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
189 Output.Write(", "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
190 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
191 if (parameter.Output && !parameter.Input) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
192 Output.Write("out "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
193 } else if (parameter.Reference) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
194 Output.Write("ref "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
195 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
196 Output.Write("{0} p{1}", parameter.Type.Name, parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
197 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
198 Output.WriteLine(") {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
199 if (memberi.ReturnType != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
200 if (memberi.ReturnType is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
201 Output.WriteLine("IntPtr retval;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
202 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
203 Output.WriteLine("{0} retval;", memberi.ReturnType.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
204 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
205 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
206 foreach (MethodParameterInfo parameter in memberi.Parameters) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
207 if (parameter.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
208 Output.WriteLine("IntPtr lp{0};", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
209 if (parameter.Input) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
210 Output.WriteLine("if (p{0} == null) {{", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
211 Output.WriteLine("lp{0} = IntPtr.Zero;", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
212 Output.WriteLine("}} else if (p{0} is IComProxy) {{", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
213 Output.WriteLine("((IComProxy)p{0}).AddRef();", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
214 Output.WriteLine("lp{0} = ((IComProxy)p{0}).ComPointer;", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
215 Output.WriteLine("} else {"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
216 Output.WriteLine("lp{0} = Marshal.GetIUnknownForObject(p{0});", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
217 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
218 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
219 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
220 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
221 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
222 Output.Write("HRESULT hr = functions{1}.{0}(pointer", memberi.Name, ftprefix); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
223 foreach (MethodParameterInfo parameter in memberi.Parameters) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
224 Output.Write(", "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
225 if (parameter.Output && !parameter.Input) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
226 Output.Write("out "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
227 } else if (parameter.Reference) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
228 Output.Write("ref "); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
229 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
230 if (parameter.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
231 Output.Write("lp{0}", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
232 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
233 Output.Write("p{0}", parameter.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
234 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
235 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
236 if (memberi.ReturnType != null) Output.Write(", out retval"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
237 Output.WriteLine(");"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
238 Output.WriteLine("Marshal.ThrowExceptionForHR(hr);"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
239 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
240 foreach (MethodParameterInfo parameter in memberi.Parameters) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
241 if (parameter.Type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
242 if (parameter.Output) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
243 Output.WriteLine("p{0} = lp{0} == IntPtr.Zero ? null : new {1}_Proxy(lp{0});", parameter.Name, parameter.Type.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
244 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
245 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
246 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
247 |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
248 if (memberi.ReturnType != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
249 if (memberi.ReturnType is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
250 Output.WriteLine("return retval == IntPtr.Zero ? null : new {0}_Proxy(retval);", memberi.ReturnType.Name); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
251 } else { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
252 Output.WriteLine("return retval;"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
253 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
254 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
255 Output.WriteLine("}"); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
256 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
257 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
258 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
259 public void WriteTypeComMarshalAttributes(TypeInfo type, String paramType) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
260 if (type == null) return; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
261 String MarshalAs = null; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
262 if (type is InterfaceTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
263 MarshalAs = "Interface"; |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
264 } else if (type is StringTypeInfo) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
265 MarshalAs = (type as StringTypeInfo).UnmanagedType.ToString(); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
266 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
267 if (MarshalAs != null) { |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
268 Output.Write("["); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
269 if (paramType != null) Output.Write("{0}: ", paramType); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
270 Output.Write("MarshalAs(UnmanagedType.{0})] ", MarshalAs); |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
271 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
272 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
273 } |
e640ca67b819
Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff
changeset
|
274 } |