private void ValidatePackage(Package package) { Microsoft.DataTransformationServices.Design.ComponentModel.EventHandlerErrorCollector events = new Microsoft.DataTransformationServices.Design.ComponentModel.EventHandlerErrorCollector(); DTSExecResult result = package.Validate(package.Connections, package.Variables, events, null); List<string> listOtherErrors = new List<string>(); listOtherErrors.AddRange(RecurseContainersAndGetVariableValidationErrors(package)); foreach (Window w in this.ApplicationObject.Windows) { IDesignerHost designer = w.Object as IDesignerHost; if (designer == null) continue; EditorWindow win = designer.GetService(typeof(Microsoft.DataWarehouse.ComponentModel.IComponentNavigator)) as EditorWindow; if (win == null) continue; if ((win.PropertiesLinkComponent as Package) == package) { AddErrorsToVSErrorList(w, listOtherErrors.ToArray()); break; } } foreach (KeyValuePair<IComponent, ICollection<IComponentErrorInfo>> pair in events.ComponentIssuesMap) { IComponent key = pair.Key; System.Collections.ICollection issues = (System.Collections.ICollection)pair.Value; IDesignerHost host = (IDesignerHost)packageDesigner.GetType().InvokeMember("DesignerHost", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, packageDesigner, null); IDesigner containerDesigner = host.GetDesigner(key); if (containerDesigner != null) { Type t = FindBaseType(containerDesigner.GetType(), "DtsContainerDesigner"); if (t == null) continue; //doesn't work... not sure why... so the following is the equivalent of this one line: //t.InvokeMember("OnContainerValidated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, containerDesigner, new object[] { result, issues }); Microsoft.DataTransformationServices.Design.ComponentModel.ComponentValidationEventArgs e = new Microsoft.DataTransformationServices.Design.ComponentModel.ComponentValidationEventArgs(containerDesigner.Component); e.Issues = issues; e.ValidationFailed = (issues != null) && (issues.Count > 0); //doesn't work... not sure why... so the following is the equivalent of this one line: //containerDesigner.GetType().InvokeMember("RaiseValidationEvent", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, containerDesigner, new object[] { e }); t.InvokeMember("PostTaskListValidationMessages", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Instance, null, containerDesigner, new object[] { e }); object componentValidationService = t.InvokeMember("componentValidationService", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Instance, null, containerDesigner, null); componentValidationService.GetType().InvokeMember("OnValidated", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, componentValidationService, new object[] { e }); } } }
private void ValidatePackage(Package package) { Microsoft.DataTransformationServices.Design.ComponentModel.EventHandlerErrorCollector events = new Microsoft.DataTransformationServices.Design.ComponentModel.EventHandlerErrorCollector(); DTSExecResult result = package.Validate(package.Connections, package.Variables, events, null); List <string> listOtherErrors = new List <string>(); listOtherErrors.AddRange(RecurseContainersAndGetVariableValidationErrors(package)); foreach (Window w in this.ApplicationObject.Windows) { IDesignerHost designer = w.Object as IDesignerHost; if (designer == null) { continue; } EditorWindow win = designer.GetService(typeof(Microsoft.DataWarehouse.ComponentModel.IComponentNavigator)) as EditorWindow; if (win == null) { continue; } if ((win.PropertiesLinkComponent as Package) == package) { AddErrorsToVSErrorList(w, listOtherErrors.ToArray()); break; } } foreach (KeyValuePair <IComponent, ICollection <IComponentErrorInfo> > pair in events.ComponentIssuesMap) { IComponent key = pair.Key; System.Collections.ICollection issues = (System.Collections.ICollection)pair.Value; IDesignerHost host = (IDesignerHost)packageDesigner.GetType().InvokeMember("DesignerHost", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, packageDesigner, null); IDesigner containerDesigner = host.GetDesigner(key); if (containerDesigner != null) { Type t = FindBaseType(containerDesigner.GetType(), "DtsContainerDesigner"); if (t == null) { continue; } //doesn't work... not sure why... so the following is the equivalent of this one line: //t.InvokeMember("OnContainerValidated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, containerDesigner, new object[] { result, issues }); Microsoft.DataTransformationServices.Design.ComponentModel.ComponentValidationEventArgs e = new Microsoft.DataTransformationServices.Design.ComponentModel.ComponentValidationEventArgs(containerDesigner.Component); e.Issues = issues; e.ValidationFailed = (issues != null) && (issues.Count > 0); //doesn't work... not sure why... so the following is the equivalent of this one line: //containerDesigner.GetType().InvokeMember("RaiseValidationEvent", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, containerDesigner, new object[] { e }); t.InvokeMember("PostTaskListValidationMessages", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Instance, null, containerDesigner, new object[] { e }); object componentValidationService = t.InvokeMember("componentValidationService", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetField | System.Reflection.BindingFlags.DeclaredOnly | System.Reflection.BindingFlags.Instance, null, containerDesigner, null); componentValidationService.GetType().InvokeMember("OnValidated", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.FlattenHierarchy | System.Reflection.BindingFlags.Instance, null, componentValidationService, new object[] { e }); } } }