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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }