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 CreateMergerDelegate generateCreateMergerDelegate() { #if !CFBuild Type[] ctorParams = new Type[] { typeof(DataTable), typeof(bool), typeof(MissingSchemaAction) }; DynamicMethod createMergerMethod = new DynamicMethod("Merger_Create", MethodAttributes.Public | MethodAttributes.Static, CallingConventions.Standard, typeof(Object), ctorParams, Type.GetTypeFromHandle(_adoMergerTypeHandle), false); Type adoMergerType = Type.GetTypeFromHandle(_adoMergerTypeHandle); ILGenerator il = createMergerMethod.GetILGenerator(); il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); ConstructorInfo ctor = adoMergerType .GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, ctorParams, null); il.Emit(OpCodes.Newobj, ctor); il.Emit(OpCodes.Isinst, typeof(Object)); il.Emit(OpCodes.Ret); CreateMergerDelegate d = (CreateMergerDelegate)createMergerMethod.CreateDelegate(typeof(CreateMergerDelegate)); return d; #else CreateMergerDelegate d = new CreateMergerDelegate(CreateMergerInvoker); 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(); }