annotate Source/TypeBuilder/TypeFactory.cs @ 3:1ef98bd70424

!bug 100 +3h Исправление проблемы BLToolkit + mono 3.4
author cin
date Fri, 22 Aug 2014 17:34:46 +0400
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.Collections;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Diagnostics;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Diagnostics.CodeAnalysis;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6 using System.IO;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using System.Linq.Expressions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using System.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10 using System.Runtime.InteropServices;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 using System.Security;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 using System.Security.Permissions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 using JetBrains.Annotations;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 using BLToolkit.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 using BLToolkit.Reflection.Emit;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 using BLToolkit.TypeBuilder.Builders;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19 using BLToolkit.Properties;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 using BLToolkit.Configuration;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 namespace BLToolkit.TypeBuilder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 public static class TypeFactory
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 static TypeFactory()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 SealTypes = true;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 var section = BLToolkitSection.Instance;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 if (section != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 var elm = section.TypeFactory;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 if (elm != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 SaveTypes = elm.SaveTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 SealTypes = elm.SealTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 LoadTypes = elm.LoadTypes;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 SetGlobalAssembly(elm.AssemblyPath, elm.Version, elm.KeyFile);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 var perm = new SecurityPermission(SecurityPermissionFlag.ControlAppDomain);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 #if FW4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 //var permissionSet = new PermissionSet(PermissionState.None);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 //permissionSet.AddPermission(perm);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62 //if (permissionSet.IsSubsetOf(AppDomain.CurrentDomain.PermissionSet))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 SubscribeAssemblyResolver();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 catch
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 if (SecurityManager.IsGranted(perm))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 SubscribeAssemblyResolver();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 static void SubscribeAssemblyResolver()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 #if FW4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 // This hack allows skipping FW 4.0 security check for partial trusted assemblies.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82 var dm = new DynamicMethod("SubscribeAssemblyResolverEx", typeof(void), null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 var emit = new EmitHelper(dm.GetILGenerator());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 emit
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 .call (typeof(AppDomain).GetProperty("CurrentDomain").GetGetMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 .ldnull
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 .ldftn (typeof(TypeFactory).GetMethod("AssemblyResolver"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 .newobj (typeof(ResolveEventHandler).GetConstructor(new[] { typeof(object), typeof(IntPtr) }))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 .callvirt (typeof(AppDomain).GetEvent("AssemblyResolve").GetAddMethod())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 .ret()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 ;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 var setter = (Action)dm.CreateDelegate(typeof(Action));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96 setter();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 #region Create Assembly
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 private static string _globalAssemblyPath;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 private static string _globalAssemblyKeyFile;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 private static Version _globalAssemblyVersion;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 private static AssemblyBuilderHelper _globalAssembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109 private static AssemblyBuilderHelper GlobalAssemblyBuilder
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 get
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 if (_globalAssembly == null && _globalAssemblyPath != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 _globalAssembly = new AssemblyBuilderHelper(_globalAssemblyPath, _globalAssemblyVersion, _globalAssemblyKeyFile);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 return _globalAssembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 public static bool SaveTypes { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 public static bool SealTypes { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123 [SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 public static void SetGlobalAssembly(string path)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 SetGlobalAssembly(path, null, null);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129 [SuppressMessage("Microsoft.Design", "CA1062:ValidateArgumentsOfPublicMethods")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 public static void SetGlobalAssembly(string path, Version version, string keyFile)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 if (_globalAssembly != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 SaveGlobalAssembly();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
134
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
135 if (!string.IsNullOrEmpty(path))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
136 _globalAssemblyPath = path;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
137
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
138 _globalAssemblyVersion = version;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
139 _globalAssemblyKeyFile = keyFile;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
140 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
141
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
142 public static void SaveGlobalAssembly()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
143 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
144 if (_globalAssembly != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
145 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
146 _globalAssembly.Save();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
147
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
148 WriteDebug("The global assembly saved in '{0}'.", _globalAssembly.Path);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
149
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
150 _globalAssembly = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
151 _globalAssemblyPath = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
152 _globalAssemblyVersion = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
153 _globalAssemblyKeyFile = null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
154 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
155 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
156
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
157 private static AssemblyBuilderHelper GetAssemblyBuilder(Type type, string suffix)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
158 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
159 var ab = GlobalAssemblyBuilder;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
160
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
161 if (ab == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
162 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
163 #if SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
164 var assemblyDir = ".";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
165 #else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
166 var assemblyDir = AppDomain.CurrentDomain.BaseDirectory;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
167
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
168 // Dynamic modules are locationless, so ignore them.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
169 // _ModuleBuilder is the base type for both
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
170 // ModuleBuilder and InternalModuleBuilder classes.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
171 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
172 if (!(type.Module is _ModuleBuilder) && type.Module.FullyQualifiedName != null && type.Module.FullyQualifiedName.IndexOf('<') < 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
173 assemblyDir = Path.GetDirectoryName(type.Module.FullyQualifiedName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
174 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
175
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
176 var fullName = type.FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
177
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
178 if (type.IsGenericType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
179 fullName = AbstractClassBuilder.GetTypeFullName(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
180
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
181 fullName = fullName.Replace('<', '_').Replace('>', '_');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
182
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
183 ab = new AssemblyBuilderHelper(Path.Combine(assemblyDir, fullName + "." + suffix + ".dll"));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
184 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
185
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
186 return ab;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
187 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
188
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
189 [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
190 private static void SaveAssembly(AssemblyBuilderHelper assemblyBuilder, Type type)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
191 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
192 if (!SaveTypes || _globalAssembly != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
193 return;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
194 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
195 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
196 assemblyBuilder.Save();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
197
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
198 WriteDebug("The '{0}' type saved in '{1}'.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
199 type.FullName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
200 assemblyBuilder.Path);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
201 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
202 catch (Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
203 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
204 WriteDebug("Can't save the '{0}' assembly for the '{1}' type: {2}.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
205 assemblyBuilder.Path,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
206 type.FullName,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
207 ex.Message);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
208 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
209 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
210
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
211 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
212
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
213 #region GetType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
214
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
215 static readonly Dictionary<Type,IDictionary<object,Type>> _builtTypes = new Dictionary<Type,IDictionary<object,Type>>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
216 static readonly Dictionary<Assembly,Assembly> _assemblies = new Dictionary<Assembly, Assembly>(10);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
217
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
218 public static bool LoadTypes { get; set; }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
219
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
220 public static Type GetType(object hashKey, Type sourceType, ITypeBuilder typeBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
221 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
222 if (hashKey == null) throw new ArgumentNullException("hashKey");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
223 if (sourceType == null) throw new ArgumentNullException("sourceType");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
224 if (typeBuilder == null) throw new ArgumentNullException("typeBuilder");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
225
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
226 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
227 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
228 lock (_builtTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
229 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
230 Type type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
231 IDictionary<object,Type> builderTable;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
232
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
233 if (_builtTypes.TryGetValue(typeBuilder.GetType(), out builderTable))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
234 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
235 if (builderTable.TryGetValue(hashKey, out type))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
236 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
237 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
238 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
239 _builtTypes.Add(typeBuilder.GetType(), builderTable = new Dictionary<object,Type>());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
240
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
241 if (LoadTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
242 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
243 var originalAssembly = sourceType.Assembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
244
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
245 Assembly extensionAssembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
246
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
247 if (!_assemblies.TryGetValue(originalAssembly, out extensionAssembly))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
248 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
249 extensionAssembly = LoadExtensionAssembly(originalAssembly);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
250 _assemblies.Add(originalAssembly, extensionAssembly);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
251 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
252
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
253 if (extensionAssembly != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
254 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
255 type = extensionAssembly.GetType(typeBuilder.GetTypeName());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
256
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
257 if (type != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
258 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
259 builderTable.Add(hashKey, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
260 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
261 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
262 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
263 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
264
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
265 var assemblyBuilder = GetAssemblyBuilder(sourceType, typeBuilder.AssemblyNameSuffix);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
266
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
267 type = typeBuilder.Build(assemblyBuilder);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
268
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
269 if (type != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
270 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
271 builderTable.Add(hashKey, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
272 SaveAssembly(assemblyBuilder, type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
273 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
274
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
275 return type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
276 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
277 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
278 catch (TypeBuilderException)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
279 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
280 throw;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
281 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
282 catch (Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
283 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
284 // Convert an Exception to TypeBuilderException.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
285 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
286 throw new TypeBuilderException(string.Format(Resources.TypeFactory_BuildFailed, sourceType.FullName), ex);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
287 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
288 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
289
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
290 public static Type GetType(Type sourceType)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
291 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
292 return
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
293 TypeHelper.IsScalar(sourceType) || sourceType.IsSealed ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
294 (!sourceType.IsAbstract && sourceType.IsDefined(typeof(BLToolkitGeneratedAttribute), true)) ?
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
295 sourceType:
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
296 GetType(sourceType, sourceType, new AbstractClassBuilder(sourceType));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
297 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
298
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
299 static class InstanceCreator<T>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
300 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
301 public static readonly Func<T> CreateInstance = Expression.Lambda<Func<T>>(Expression.New(TypeFactory.GetType(typeof(T)))).Compile();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
302 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
303
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
304 public static T CreateInstance<T>() where T: class
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
305 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
306 return InstanceCreator<T>.CreateInstance();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
307 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
308
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
309 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
310
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
311 #region Private Helpers
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
312
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
313 static Assembly LoadExtensionAssembly(Assembly originalAssembly)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
314 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
315 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
316
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
317 if (originalAssembly is _AssemblyBuilder)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
318 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
319 // This is a generated assembly. Even if it has a valid Location,
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
320 // there is definitelly no extension assembly at this path.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
321 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
322 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
323 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
324
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
325 try
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
326 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
327 var originalAssemblyLocation = new Uri(originalAssembly.EscapedCodeBase).LocalPath;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
328 var extensionAssemblyLocation = Path.ChangeExtension(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
329 originalAssemblyLocation, "BLToolkitExtension.dll");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
330
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
331 if (File.GetLastWriteTime(originalAssemblyLocation) <= File.GetLastWriteTime(extensionAssemblyLocation))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
332 return Assembly.LoadFrom(extensionAssemblyLocation);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
333
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
334 Debug.WriteLineIf(File.Exists(extensionAssemblyLocation),
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
335 string.Format("Extension assembly '{0}' is out of date. Please rebuild.",
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
336 extensionAssemblyLocation), typeof(TypeAccessor).FullName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
337
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
338 // Some good man may load this assembly already. Like IIS does it.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
339 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
340 var extensionAssemblyName = originalAssembly.GetName(true);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
341 extensionAssemblyName.Name += ".BLToolkitExtension";
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
342
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
343 foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
344 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
345 // Note that assembly version and strong name are compared too.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
346 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
347 if (AssemblyName.ReferenceMatchesDefinition(assembly.GetName(false), extensionAssemblyName))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
348 return assembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
349 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
350 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
351 catch (Exception ex)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
352 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
353 // Extension exist, but can't be loaded for some reason.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
354 // Switch back to code generation
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
355 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
356 Debug.WriteLine(ex, typeof(TypeAccessor).FullName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
357 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
358
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
359 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
360
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
361 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
362 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
363
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
364 [Conditional("DEBUG")]
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
365 private static void WriteDebug(string format, params object[] parameters)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
366 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
367 Debug.WriteLine(string.Format(format, parameters));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
368 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
369
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
370 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
371
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
372 #region Resolve Types
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
373
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
374 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
375 /// Initializes AssemblyResolve hooks for the current <see cref="AppDomain"/>.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
376 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
377 public static void Init()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
378 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
379 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
380 // The code actually does nothing except an implicit call to the type constructor.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
381 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
382 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
383
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
384 public static Assembly AssemblyResolver(object sender, ResolveEventArgs args)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
385 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
386 var name = args.Name;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
387 var nameParts = name.Split(',');
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
388
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
389 if (nameParts.Length > 0 && nameParts[0].ToLower().EndsWith(".dll"))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
390 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
391 nameParts[0] = nameParts[0].Substring(0, nameParts[0].Length - 4);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
392 name = string.Join(",", nameParts);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
393 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
394
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
395 lock (_builtTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
396 foreach (var type in _builtTypes.Keys)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
397 if (type.FullName == name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
398 return type.Assembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
399
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
400 #if !SILVERLIGHT
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
401
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
402 var idx = name.IndexOf("." + TypeBuilderConsts.AssemblyNameSuffix);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
403
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
404 if (idx > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
405 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
406 var typeName = name.Substring(0, idx);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
407 var type = Type.GetType(typeName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
408
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
409 if (type == null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
410 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
411 var ass = ((AppDomain)sender).GetAssemblies();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
412
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
413 // CLR can't find an assembly built on previous AssemblyResolve event.
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
414 //
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
415 for (var i = ass.Length - 1; i >= 0; i--)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
416 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
417 if (string.Compare(ass[i].FullName, name) == 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
418 return ass[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
419 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
420
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
421 for (var i = ass.Length - 1; i >= 0; i--)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
422 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
423 var a = ass[i];
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
424
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
425 if (!(
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
426 #if FW4
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
427 a.IsDynamic ||
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
428 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
429 a is _AssemblyBuilder) &&
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
430 (a.CodeBase.IndexOf("Microsoft.NET/Framework") > 0 || a.FullName.StartsWith("System."))) continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
431
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
432 type = a.GetType(typeName);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
433
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
434 if (type != null) break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
435
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
436 foreach (var t in a.GetTypes())
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
437 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
438 if (!t.IsAbstract)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
439 continue;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
440
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
441 if (t.FullName == typeName)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
442 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
443 type = t;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
444 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
445 else
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
446 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
447 if (t.FullName.IndexOf('+') > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
448 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
449 var s = typeName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
450
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
451 while (type == null && (idx = s.LastIndexOf(".")) > 0)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
452 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
453 s = s.Remove(idx, 1).Insert(idx, "+");
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
454
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
455 if (t.FullName == s)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
456 type = t;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
457 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
458 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
459 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
460
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
461 if (type != null) break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
462 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
463
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
464 if (type != null) break;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
465 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
466 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
467
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
468 if (type != null)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
469 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
470 var newType = GetType(type);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
471
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
472 if (newType.Assembly.FullName == name)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
473 return newType.Assembly;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
474 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
475 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
476
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
477 #endif
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
478
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
479 return null;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
480 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
481
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
482 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
483 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
484 }