static FeatureMerger() { Type adoMergerType = Type.GetType("System.Data.Merger, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); _adoMergerTypeHandle = adoMergerType.TypeHandle; _createMerger = generateCreateMergerDelegate(); _mergeSchema = generateMergeSchemaDelegate(); _getKeyIndex = generateGetKeyIndexDelegate(); }
private static MergeSchemaDelegate generateMergeSchemaDelegate() { #if !CFBuild DynamicMethod mergeSchemaMethod = new DynamicMethod("Merger_MergeSchema", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, typeof(DataTable), new Type[] { typeof(object), typeof(DataTable) }, Type.GetTypeFromHandle(_adoMergerTypeHandle), false); Type merger = Type.GetTypeFromHandle(_adoMergerTypeHandle); ILGenerator il = mergeSchemaMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Castclass, merger); il.Emit(OpCodes.Ldarg_1); MethodInfo mergeSchemaInfo = merger.GetMethod("MergeSchema", BindingFlags.Instance | BindingFlags.NonPublic); il.Emit(OpCodes.Call, mergeSchemaInfo); il.Emit(OpCodes.Ret); MergeSchemaDelegate d = (MergeSchemaDelegate)mergeSchemaMethod.CreateDelegate(typeof(MergeSchemaDelegate)); return d; #else MergeSchemaDelegate d = new MergeSchemaDelegate(MergeSchemaInvoker); return d; #endif }
static FeatureMerger() { _createMerger = generateCreateMergerDelegate(); _mergeSchema = generateMergeSchemaDelegate(); _getKeyIndex = generateGetKeyIndexDelegate(); _getDataKeyColumnReference = generateGetDataKeyColumnReferenceDelegate(); _createDataKey = generateCreateDataKeyDelegate(); _createEmptyDataKey = generateCreateEmptyDataKeyDelegate(); _getDataKeyFromUniqueConstraint = generateGetDataKeyFromUniqueConstraintDelegate(); _dataKeyGetSortIndex = generateDataKeyGetSortIndexDelegate(); _getDataKeyHasValue = generateGetDataKeyHasValueDelegate(); _cloneDataColumn = generateCloneDataColumnDelegate(); }