annotate InteropCodeGen/ComInteropProxyGenerator.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
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; }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
11 public Boolean GenerateDelegates { get; set; }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
12 public Boolean GenerateVTables { get; set; }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
13 public Boolean GenerateProxies { get; set; }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
14 public Boolean GenerateCCWs { get; set; }
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
15
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
16 public ComInteropProxyGenerator(TextWriter output) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
17 Output = output;
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
18 GenerateDelegates = true;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
19 GenerateVTables = true;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
20 GenerateProxies = true;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
21 GenerateCCWs = true;
6
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 public void WriteLibrary(LibraryInfo lib) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
24 if (GenerateProxies) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
25 Output.WriteLine("interface IComProxy {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
26 Output.WriteLine("IntPtr ComPointer { get; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
27 Output.WriteLine("void AddRef();");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
28 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
29 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
30
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
31 if (GenerateCCWs) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
32 Output.WriteLine("public interface IComCallableWrapper {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
33 Output.WriteLine("Guid IID { get; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
34 Output.WriteLine("Int32 ReferenceCount { get; set; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
35 Output.WriteLine("Object Object { get; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
36 Output.WriteLine("IntPtr Pointer { get; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
37 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
38 Output.WriteLine("public unsafe class IUnknown_CCW {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
39 Output.WriteLine("public static Dictionary<IntPtr, IComCallableWrapper> Instances = new Dictionary<IntPtr, IComCallableWrapper>();");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
40 Output.WriteLine("public static IUnknown_vtable GetFunctionTable() {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
41 Output.WriteLine("IUnknown_vtable functions;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
42 Output.WriteLine("functions.AddRef = AddRef;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
43 Output.WriteLine("functions.QueryInterface = QueryInterface;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
44 Output.WriteLine("functions.Release = Release;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
45 Output.WriteLine("return functions;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
46 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
47 Output.WriteLine("public static HRESULT QueryInterface(IntPtr pthis, ref Guid priid, out IntPtr p) {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
48 Output.WriteLine("p = pthis;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
49 Output.WriteLine("if (Instances[pthis].IID != priid) return 1;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
50 Output.WriteLine("Instances[pthis].ReferenceCount++;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
51 Output.WriteLine("return 0;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
52 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
53 Output.WriteLine("public static HRESULT AddRef(IntPtr pthis) {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
54 Output.WriteLine("Instances[pthis].ReferenceCount++;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
55 Output.WriteLine("return Instances[pthis].ReferenceCount;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
56 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
57 Output.WriteLine("public static HRESULT Release(IntPtr pthis) {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
58 Output.WriteLine("IComCallableWrapper cw = Instances[pthis];");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
59 Output.WriteLine("cw.ReferenceCount--;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
60 Output.WriteLine("if (cw.ReferenceCount == 0) {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
61 Output.WriteLine("Instances.Remove(pthis);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
62 Output.WriteLine("if (cw is IDisposable) (cw as IDisposable).Dispose();");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
63 Output.WriteLine("Marshal.FreeCoTaskMem(*(IntPtr*)pthis);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
64 Output.WriteLine("Marshal.FreeCoTaskMem(pthis);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
65 Output.WriteLine("return 0;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
66 Output.WriteLine("} else {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
67 Output.WriteLine("return cw.ReferenceCount;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
68 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
69 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
70 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
71 }
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
72 foreach (KeyValuePair<String, InterfaceInfo> intf in lib.Interfaces) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
73 WriteInterface(intf.Value);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
74 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
75 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
76 public void WriteInterface(InterfaceInfo intf) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
77 /*List<InterfaceMemberInfo> members = new List<InterfaceMemberInfo>();
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
78 InterfaceInfo intfp = intf.Value;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
79 while (intfp != null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
80 members.AddRange(intfp.Members);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
81 intfp = intfp.Extends;
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
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
84 if (GenerateDelegates) WriteInterfaceDelegates(intf.Name, intf.Members);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
85 if (GenerateVTables) WriteInterfaceVTableStructure(intf.Name, intf.Extends, intf.Members);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
86 if (GenerateProxies) WriteInterfaceProxyClasses(intf);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
87 if (GenerateCCWs) WriteInterfaceCCWClass(intf);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
88 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
89 private void WriteInterfaceDelegates(String Name, IEnumerable<InterfaceMemberInfo> Members) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
90 foreach (InterfaceMemberInfo member in Members) {
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
91 if (member is PropertyInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
92 PropertyInfo memberi = (PropertyInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
93 if (memberi.Gettable) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
94 Output.Write("{2} delegate HRESULT {0}_{1}_get_Delegate(IntPtr pThis, ", Name, memberi.Name, TypeModifiers);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
95 if (memberi.Type is InterfaceTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
96 Output.WriteLine("out IntPtr value);");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
97 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
98 WriteTypeComMarshalAttributes(memberi.Type, null);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
99 Output.WriteLine("out {0} value);", memberi.Type.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 if (memberi.Settable) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
103 Output.Write("{2} delegate HRESULT {0}_{1}_set_Delegate(IntPtr pThis, ", Name, memberi.Name, TypeModifiers);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
104 if (memberi.Type is InterfaceTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
105 Output.WriteLine("IntPtr value);");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
106 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
107 WriteTypeComMarshalAttributes(memberi.Type, null);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
108 Output.WriteLine("{0} value);", memberi.Type.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
109 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
110 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
111 } else if (member is MethodInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
112 MethodInfo memberi = (MethodInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
113 Output.Write("{0} delegate ", TypeModifiers);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
114 Output.Write("HRESULT ");
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
115 Output.Write("{0}_{1}_Delegate(IntPtr mThis", Name, memberi.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
116 foreach (MethodParameterInfo param in memberi.Parameters) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
117 Output.Write(", ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
118 if (param.Type is InterfaceTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
119 if (param.Output && !param.Input) Output.Write("out ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
120 else if (param.Reference) Output.Write("ref ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
121 Output.Write("IntPtr p{0}", param.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
122 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
123 WriteTypeComMarshalAttributes(param.Type, null);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
124 if (param.Output && !param.Input) Output.Write("out ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
125 else if (param.Reference) Output.Write("ref ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
126 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
127 }
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 if (memberi.ReturnType != null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
130 Output.Write(", ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
131 if (memberi.ReturnType is InterfaceTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
132 Output.Write("out IntPtr mOut");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
133 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
134 WriteTypeComMarshalAttributes(memberi.ReturnType, null);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
135 Output.Write("out {0} mOut", memberi.ReturnType.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
136 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
137 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
138 Output.WriteLine(");");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
139 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
140 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
141 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
142 private void WriteInterfaceVTableStructure(String Name, InterfaceInfo Extends, IEnumerable<InterfaceMemberInfo> Members) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
143 Output.WriteLine("{1} struct {0}_vtable {{", Name, TypeModifiers);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
144 if (Extends != null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
145 Output.WriteLine("public {0}_vtable {0};", Extends.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
146 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
147 foreach (InterfaceMemberInfo member in Members) {
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
148 if (member is PropertyInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
149 PropertyInfo memberi = (PropertyInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
150 if (memberi.Gettable) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
151 Output.WriteLine("[MarshalAs(UnmanagedType.FunctionPtr)] public {0}_{1}_get_Delegate get_{1};", Name, memberi.Name);
6
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 if (memberi.Settable) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
154 Output.WriteLine("[MarshalAs(UnmanagedType.FunctionPtr)] public {0}_{1}_set_Delegate set_{1};", Name, memberi.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
155 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
156 } else if (member is MethodInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
157 MethodInfo memberi = (MethodInfo)member;
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
158 Output.WriteLine("[MarshalAs(UnmanagedType.FunctionPtr)] public {0}_{1}_Delegate {1};", Name, memberi.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
159 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
160 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
161 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
162 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
163 private void WriteInterfaceMembers(ICollection<InterfaceMemberInfo> members) {
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
164 foreach (InterfaceMemberInfo member in members) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
165 if (member is PropertyInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
166 PropertyInfo memberi = (PropertyInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
167 if (!memberi.Gettable && !memberi.Settable) continue;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
168 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
169 if (memberi.Gettable) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
170 Output.WriteLine("get {");
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
171 WriteMethodComCall("get_" + memberi.Name, null, memberi.Type);
6
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 if (memberi.Settable) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
175 Output.WriteLine("set {");
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
176 WriteMethodComCall("set_" + memberi.Name, new MethodParameterInfo(null, memberi.Type, true, false, false));
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
177 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
178 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
179 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
180 } else if (member is MethodInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
181 MethodInfo memberi = (MethodInfo)member;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
182 Output.Write("public ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
183 if (memberi.ReturnType == null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
184 Output.Write("void");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
185 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
186 Output.Write(memberi.ReturnType.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
187 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
188 Output.Write(" {0}(", memberi.Name);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
189 Boolean first = true;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
190 foreach (MethodParameterInfo parameter in memberi.Parameters) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
191 if (first) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
192 first = false;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
193 } else {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
194 Output.Write(", ");
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 if (parameter.Output && !parameter.Input) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
197 Output.Write("out ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
198 } else if (parameter.Reference) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
199 Output.Write("ref ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
200 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
201 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
202 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
203 Output.WriteLine(") {");
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
204
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
205 WriteMethodComCall(memberi.Name, memberi.Parameters, memberi.ReturnType);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
206
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
207 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
208 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
209 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
210 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
211 private void WriteMethodComCall(String fname, params MethodParameterInfo[] parameters) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
212 WriteMethodComCall(fname, (IEnumerable<MethodParameterInfo>)parameters, null);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
213 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
214 private void WriteMethodComCall(String fname, IEnumerable<MethodParameterInfo> parameters, TypeInfo returnType) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
215 if (returnType == null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
216 } else if (returnType is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
217 Output.WriteLine("IntPtr retval;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
218 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
219 Output.WriteLine("{0} retval;", returnType.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
220 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
221
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
222 if (parameters != null) foreach (MethodParameterInfo parameter in parameters) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
223 if (parameter.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
224 String pname = parameter.Name;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
225 if (pname == null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
226 pname = "value";
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
227 } else {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
228 pname = "p" + pname;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
229 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
230 Output.WriteLine("IntPtr l{0};", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
231 if (parameter.Input) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
232 Output.WriteLine("if ({0} == null) {{", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
233 Output.WriteLine("l{0} = IntPtr.Zero;", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
234 Output.WriteLine("}} else if ({0} is IComProxy) {{", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
235 Output.WriteLine("((IComProxy){0}).AddRef();", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
236 Output.WriteLine("l{0} = ((IComProxy){0}).ComPointer;", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
237 Output.WriteLine("} else {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
238 if (parameter.Type.Name == "IFramebuffer") {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
239 Output.WriteLine("l{0} = (new {1}_CCW({0})).Pointer;", pname, parameter.Type.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
240 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
241 Output.WriteLine("l{0} = Marshal.GetIUnknownForObject({0});", pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
242 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
243 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
244 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
245 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
246 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
247
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
248 Output.Write("HRESULT hr = functions.{0}(Pointer", fname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
249 if (parameters != null) foreach (MethodParameterInfo parameter in parameters) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
250 Output.Write(", ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
251 if (parameter.Output && !parameter.Input) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
252 Output.Write("out ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
253 } else if (parameter.Reference) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
254 Output.Write("ref ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
255 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
256 String pname = parameter.Name;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
257 if (pname == null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
258 pname = "value";
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
259 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
260 pname = "p" + pname;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
261 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
262 if (parameter.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
263 pname = "l" + pname;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
264 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
265 Output.Write(pname);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
266 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
267 if (returnType != null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
268 Output.Write(", out retval");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
269 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
270 Output.WriteLine(");");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
271 Output.WriteLine("Marshal.ThrowExceptionForHR(hr);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
272
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
273 if (parameters != null) foreach (MethodParameterInfo parameter in parameters) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
274 if (parameter.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
275 if (parameter.Output) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
276 Output.WriteLine("p{0} = lp{0} == IntPtr.Zero ? null : new {1}_Proxy(lp{0});", parameter.Name, parameter.Type.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
277 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
278 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
279 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
280
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
281 if (returnType == null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
282 } else if (returnType is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
283 Output.WriteLine("return retval == IntPtr.Zero ? null : new {0}_Proxy(retval);", returnType.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
284 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
285 Output.WriteLine("return retval;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
286 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
287 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
288 private void WriteInterfaceProxyClasses(InterfaceInfo intf) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
289 if (intf.Extends != null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
290 Output.WriteLine("{1} unsafe class {0}_Proxy : {2}_Proxy, {0} {{", intf.Name, TypeModifiers, intf.Extends.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
291 Output.WriteLine("public new static Guid IID = new Guid(\"{0}\");", intf.IID);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
292 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
293 Output.WriteLine("{1} unsafe class {0}_Proxy : IComProxy, {0} {{", intf.Name, TypeModifiers);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
294 Output.WriteLine("public IntPtr Pointer { get; protected set; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
295 Output.WriteLine("IntPtr IComProxy.ComPointer { get { return Pointer; } }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
296 Output.WriteLine("public static Guid IID = new Guid(\"{0}\");", intf.IID);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
297 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
298 Output.WriteLine("private {0}_vtable functions;", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
299
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
300 Output.WriteLine("public {0}_Proxy(IntPtr p) : this(p, IID) {{ }}", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
301
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
302 if (intf.Extends != null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
303 Output.WriteLine("public {0}_Proxy(IntPtr p, Guid iid) : base(p, iid) {{", intf.Name, intf.Extends.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
304 Output.WriteLine("functions = ({0}_vtable)Marshal.PtrToStructure(*(IntPtr*)Pointer, typeof({0}_vtable));", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
305 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
306 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
307 Output.WriteLine("public {0}_Proxy(IntPtr p, Guid iid) {{", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
308 Output.WriteLine("IUnknown_vtable ft = (IUnknown_vtable)Marshal.PtrToStructure(*(IntPtr*)p, typeof(IUnknown_vtable));");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
309 Output.WriteLine("HRESULT hr = ft.QueryInterface(p, ref iid, out p);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
310 Output.WriteLine("Marshal.ThrowExceptionForHR(hr);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
311 Output.WriteLine("ft.AddRef(p);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
312 Output.WriteLine("Pointer = p;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
313 Output.WriteLine("functions = ({0}_vtable)Marshal.PtrToStructure(*(IntPtr*)Pointer, typeof({0}_vtable));", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
314 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
315 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
316
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
317 if (intf.Name == "IUnknown") {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
318 Output.Write("~{0}_Proxy() {{ functions.Release(Pointer); }}", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
319 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
320
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
321 WriteInterfaceMembers(intf.Members);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
322 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
323 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
324 private void WriteInterfaceCCWClass(InterfaceInfo intf) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
325 if (intf.Extends == null) return;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
326 Boolean writeMembers = true;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
327 if (intf.Name == "IDispatch" || intf.Name == "IErrorInfo") writeMembers = false;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
328 Output.WriteLine("public unsafe class {0}_CCW : IComCallableWrapper {{", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
329 Output.WriteLine("public IntPtr Pointer { get; protected set; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
330 Output.WriteLine("public Object Object { get; private set; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
331 Output.WriteLine("public Int32 ReferenceCount { get; set; }");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
332 Output.WriteLine("Guid IComCallableWrapper.IID {{ get {{ return {0}_Proxy.IID; }} }}", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
333
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
334 Output.WriteLine("public static {0}_vtable GetFunctionTable() {{", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
335 Output.WriteLine("{0}_vtable functions = new {0}_vtable();", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
336 if (writeMembers) foreach (InterfaceMemberInfo member in intf.Members) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
337 if (member is PropertyInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
338 PropertyInfo memberi = (PropertyInfo)member;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
339 if (memberi.Gettable) Output.WriteLine("functions.get_{0} = get_{0};", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
340 if (memberi.Settable) Output.WriteLine("functions.set_{0} = set_{0};", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
341 } else if (member is MethodInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
342 MethodInfo memberi = (MethodInfo)member;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
343 Output.WriteLine("functions.{0} = {0};", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
344 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
345 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
346 if (intf.Extends != null) Output.WriteLine("functions.{0} = {0}_CCW.GetFunctionTable();", intf.Extends.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
347 Output.WriteLine("return functions;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
348 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
349
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
350 Output.WriteLine("public {0}_CCW({0} p) {{", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
351 Output.WriteLine("Object = p;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
352 Output.WriteLine("Pointer = Marshal.AllocCoTaskMem(IntPtr.Size);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
353 Output.WriteLine("*(IntPtr*)Pointer = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof({0}_vtable)));", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
354 Output.WriteLine("Marshal.StructureToPtr(GetFunctionTable(), *(IntPtr*)Pointer, false);");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
355 Output.WriteLine("IUnknown_CCW.Instances[Pointer] = this;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
356 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
357 Output.WriteLine("private static {0} GetInstance(IntPtr pthis) {{", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
358 Output.WriteLine("return ({0})IUnknown_CCW.Instances[pthis].Object;", intf.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
359 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
360
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
361 if (writeMembers) foreach (InterfaceMemberInfo member in intf.Members) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
362 if (member is PropertyInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
363 PropertyInfo memberi = (PropertyInfo)member;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
364 if (memberi.Gettable) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
365 Output.Write("private static HRESULT get_{0}(IntPtr pthis, out ", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
366 if (memberi.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
367 Output.Write("IntPtr");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
368 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
369 Output.Write(memberi.Type.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
370 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
371 Output.WriteLine(" ret) {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
372 if (memberi.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
373 Output.WriteLine("{1} iret = GetInstance(pthis).{0};", memberi.Name, memberi.Type.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
374 Output.WriteLine("if (iret == null) { ret = IntPtr.Zero; } else if (iret is IComProxy) { ret = ((IComProxy)iret).ComPointer; } else {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
375 Output.WriteLine("ret = (new {0}_CCW(iret)).Pointer; }}", memberi.Type.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
376 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
377 Output.WriteLine("ret = GetInstance(pthis).{0};", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
378 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
379 Output.WriteLine("return 0;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
380 Output.WriteLine("}");
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
381 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
382 if (memberi.Settable) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
383 Output.Write("private static HRESULT set_{0}(IntPtr pthis, ", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
384 if (memberi.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
385 Output.Write("IntPtr");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
386 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
387 Output.Write(memberi.Type.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
388 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
389 Output.WriteLine(" value) {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
390 if (memberi.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
391 Output.WriteLine("{0} ivalue;", memberi.Type.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
392 Output.WriteLine("if (value == IntPtr.Zero) { ivalue = null; } else if (IUnknown_CCW.Instances.ContainsKey(value)) { ivalue = ({0})(IUnknown_CCW.Instances[value].Object) } else { ivalue = new {0}_CCW(value); }", memberi.Type.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
393 Output.WriteLine("GetInstance(pthis).{0} = ivalue;", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
394 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
395 Output.WriteLine("GetInstance(pthis).{0} = value;", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
396 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
397 Output.WriteLine("return 0;");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
398 Output.WriteLine("}");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
399 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
400 } else if (member is MethodInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
401 MethodInfo memberi = (MethodInfo)member;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
402 Output.Write("private static HRESULT {0}(IntPtr pthis", memberi.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
403 foreach (MethodParameterInfo parameter in memberi.Parameters) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
404 Output.Write(", ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
405 if (parameter.Output && !parameter.Input) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
406 Output.Write("out ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
407 } else if (parameter.Reference) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
408 Output.Write("ref ");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
409 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
410 if (parameter.Type is InterfaceTypeInfo) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
411 Output.Write("IntPtr");
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
412 } else {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
413 Output.Write(parameter.Type.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
414 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
415 Output.Write(" p{0}", parameter.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
416 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
417 if (memberi.ReturnType != null) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
418 Output.Write(", out ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
419 if (memberi.ReturnType is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
420 Output.Write("IntPtr");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
421 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
422 Output.Write(memberi.ReturnType.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
423 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
424 Output.Write(" retval");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
425 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
426 Output.WriteLine(") {");
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
427
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
428 foreach (MethodParameterInfo parameter in memberi.Parameters) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
429 if (parameter.Type is InterfaceTypeInfo) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
430 Output.WriteLine("{0} i{1};", parameter.Type.Name, parameter.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
431 if (parameter.Input) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
432 Output.WriteLine("if (p{0} == IntPtr.Zero) {{ i{0} = null; }} else if (IUnknown_CCW.Instances.ContainsKey(p{0})) {{ i{0} = ({1})(IUnknown_CCW.Instances[p{0}].Object); }} else {{ i{0} = new {1}_Proxy(p{0}); }}", parameter.Name, parameter.Type.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
433 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
434 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
435 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
436
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
437 if (memberi.ReturnType != null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
438 if (memberi.ReturnType is InterfaceTypeInfo) {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
439 Output.Write("{0} iretval = ", memberi.ReturnType.Name);
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
440 } else {
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
441 Output.Write("retval = ");
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
442 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
443 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
444 Output.Write("GetInstance(pthis).{0}(", memberi.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
445 bool first = true;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
446 foreach (MethodParameterInfo parameter in memberi.Parameters) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
447 if (first) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
448 first = false;
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
449 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
450 Output.Write(", ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
451 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
452 if (parameter.Output && !parameter.Input) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
453 Output.Write("out ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
454 } else if (parameter.Reference) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
455 Output.Write("ref ");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
456 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
457 if (parameter.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
458 Output.Write("i{0}", parameter.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
459 } else {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
460 Output.Write("p{0}", parameter.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
461 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
462 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
463 Output.WriteLine(");");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
464
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
465 foreach (MethodParameterInfo parameter in memberi.Parameters) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
466 if (parameter.Type is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
467 if (parameter.Output || parameter.Reference) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
468 Output.WriteLine("if (i{0} == null) {{ p{0} = IntPtr.Zero; }} else if (i{0} is IComProxy) {{ p{0} = ((IComProxy)i{0}).ComPointer; }} else {{", parameter.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
469 Output.WriteLine("p{1} = (new {0}_CCW(i{1})).Pointer; }}", parameter.Type.Name, parameter.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
470 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
471 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
472 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
473 if (memberi.ReturnType is InterfaceTypeInfo) {
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
474 Output.WriteLine("if (iretval == null) { retval = IntPtr.Zero; } else if (iretval is IComProxy) { retval = ((IComProxy)iretval).ComPointer; } else {");
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
475 Output.WriteLine("retval = (new {0}_CCW(iretval)).Pointer; }}", memberi.ReturnType.Name);
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
476 }
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
477
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
478 Output.WriteLine("return 0;");
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
479 Output.WriteLine("}");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
480 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
481 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
482 Output.WriteLine("}");
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
483 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
484
6
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
485 public void WriteTypeComMarshalAttributes(TypeInfo type, String paramType) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
486 if (type == null) return;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
487 String MarshalAs = null;
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
488 if (type is InterfaceTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
489 MarshalAs = "Interface";
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
490 } else if (type is StringTypeInfo) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
491 MarshalAs = (type as StringTypeInfo).UnmanagedType.ToString();
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
492 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
493 if (MarshalAs != null) {
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
494 Output.Write("[");
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
495 if (paramType != null) Output.Write("{0}: ", paramType);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
496 Output.Write("MarshalAs(UnmanagedType.{0})] ", MarshalAs);
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
497 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
498 }
e640ca67b819 Added extended COM interop code generator for interfaces and proxies
Ivo Smits
parents:
diff changeset
499 }
7
a7650e26195f Added support for generating Com Callable Wrappers
Ivo Smits
parents: 6
diff changeset
500 }