About the Extending the replication synchronization process Sample
[C#]
RegisterExtension.cs
using System; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Windows.Forms; using ESRI.ArcGIS.DataSourcesGDB; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; namespace RasterSyncExtensionReg { /// <summary> /// A static class with a Main method for registering the RasterSyncExtension.RasterSyncWorkspaceExtension class. /// </summary> public class RegisterExtension { /// <summary> /// A path to the geodatabase's connection file. /// </summary> private static readonly String workspacePath = @"C:\MyGeodatabase.sde"; /// <summary> /// The type of geodatabase the extension is being registered with. /// </summary> private static readonly GeodatabaseType geodatabaseType = GeodatabaseType.ArcSDE; /// <summary> /// The GUID of the workspace extension to register. /// </summary> private static readonly String extensionGuid = "{97CD2883-37CB-4f76-BD0F-945279C783DC}"; public static void Main(string[] args) { #region Licensing ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop); IAoInitialize aoInitialize = new AoInitializeClass(); esriLicenseStatus licenseStatus = aoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo); if (licenseStatus != esriLicenseStatus.esriLicenseCheckedOut) { MessageBox.Show("An ArcInfo license could not be checked out."); return; } #endregion try { // Open the workspace. IWorkspaceFactory workspaceFactory = null; switch (geodatabaseType) { case GeodatabaseType.ArcSDE: workspaceFactory = new SdeWorkspaceFactoryClass(); break; case GeodatabaseType.FileGDB: workspaceFactory = new FileGDBWorkspaceFactoryClass(); break; case GeodatabaseType.PersonalGDB: workspaceFactory = new AccessWorkspaceFactoryClass(); break; } IWorkspace workspace = workspaceFactory.OpenFromFile(workspacePath, 0); IWorkspaceExtensionManager workspaceExtensionManager = (IWorkspaceExtensionManager)workspace; // Create a UID for the workspace extension. UID uid = new UIDClass(); uid.Value = extensionGuid; // Determine whether there are any existing geodatabase-register extensions. // To disambiguate between GDB-register extensions and component category extensions, // check the extension count of a new scratch workspace. IScratchWorkspaceFactory scratchWorkspaceFactory = new FileGDBScratchWorkspaceFactoryClass(); IWorkspace scratchWorkspace = scratchWorkspaceFactory.CreateNewScratchWorkspace(); IWorkspaceExtensionManager scratchExtensionManager = (IWorkspaceExtensionManager)scratchWorkspace; Boolean workspaceExtensionApplied = false; UID gdbRegisteredUID = null; try { workspaceExtensionApplied = (workspaceExtensionManager.ExtensionCount > scratchExtensionManager.ExtensionCount); } catch (COMException comExc) { // This is necessary in case the existing extension could not be initiated. if (comExc.ErrorCode == (int)fdoError.FDO_E_WORKSPACE_EXTENSION_CREATE_FAILED) { // Parse the error message for the current extension's GUID. Regex regex = new Regex("(?<guid>{[^}]+})"); MatchCollection matchCollection = regex.Matches(comExc.Message); if (matchCollection.Count > 0) { Match match = matchCollection[0]; gdbRegisteredUID = new UIDClass(); gdbRegisteredUID.Value = match.Groups["guid"].Value; workspaceExtensionApplied = true; } else { throw comExc; } } else { throw comExc; } } if (workspaceExtensionApplied) { if (gdbRegisteredUID == null) { // There is GDB-registered extension on the SDE workspace. Find the SDE extension that is not // applied to the scratch workspace. for (int i = 0; i < workspaceExtensionManager.ExtensionCount; i++) { IWorkspaceExtension workspaceExtension = workspaceExtensionManager.get_Extension(i); IWorkspaceExtension scratchExtension = scratchExtensionManager.FindExtension(workspaceExtension.GUID); if (scratchExtension == null) { gdbRegisteredUID = workspaceExtension.GUID; } } } } // If the extension could be located, remove it. if (gdbRegisteredUID != null) { workspaceExtensionManager.UnRegisterExtension(gdbRegisteredUID); } // Register the extension. workspaceExtensionManager.RegisterExtension("RasterSyncExtension.RasterSyncWorkspaceExtension", uid); } catch (COMException comExc) { switch (comExc.ErrorCode) { case (int)fdoError.FDO_E_WORKSPACE_EXTENSION_NO_REG_PRIV: MessageBox.Show("The connection file's privileges are insufficient to perform this operation.", "Register Workspace Extension", MessageBoxButtons.OK, MessageBoxIcon.Error); break; case (int)fdoError.FDO_E_WORKSPACE_EXTENSION_CREATE_FAILED: String createErrorMessage = String.Concat("The workspace extension could not be created.", Environment.NewLine, "Ensure that it has been registered for COM Interop."); MessageBox.Show(createErrorMessage, "Register Workspace Extension", MessageBoxButtons.OK, MessageBoxIcon.Error); break; case (int)fdoError.FDO_E_WORKSPACE_EXTENSION_DUP_GUID: case (int)fdoError.FDO_E_WORKSPACE_EXTENSION_DUP_NAME: String dupErrorMessage = String.Concat("A duplicate name or GUID was detected. Make sure any existing GDB-registered", "workspaces are not component category-registered as well."); MessageBox.Show(dupErrorMessage, "Register Workspace Extension", MessageBoxButtons.OK, MessageBoxIcon.Error); break; default: String otherErrorMessage = String.Format("An unexpected error has occurred:{0}{1}{2}", Environment.NewLine, comExc.Message, comExc.ErrorCode); MessageBox.Show(otherErrorMessage); break; } } catch (Exception exc) { String errorMessage = String.Format("An unexpected error has occurred:{0}{1}", Environment.NewLine, exc.Message); MessageBox.Show(errorMessage); } // Shutdown the AO initializer. aoInitialize.Shutdown(); } } /// <summary> /// An enumeration containing geodatabase types. /// </summary> public enum GeodatabaseType { /// <summary> /// ArcSDE geodatabases. /// </summary> ArcSDE = 0, /// <summary> /// File geodatabases. /// </summary> FileGDB = 1, /// <summary> /// Personal geodatabases. /// </summary> PersonalGDB = 2 } }
[Visual Basic .NET]
RegisterExtension.vb
''' <summary> ''' A static class with a Main method for registering the RasterSyncExtension.RasterSyncWorkspaceExtension class. ''' </summary> Module RegisterExtension ''' <summary> ''' A path to the geodatabase's connection file. ''' </summary> Private ReadOnly workspacePath As String = "C:\MyGeodatabase.sde" ''' <summary> ''' The type of geodatabase the extension will be applied to. ''' </summary> Private ReadOnly geodatabaseType As GeodatabaseTypes = GeodatabaseTypes.ArcSDE ''' <summary> ''' The GUID of the workspace extension to register. ''' </summary> Private ReadOnly extensionGuid As String = "{A9FC5EB2-33F9-4941-AE69-775ECF688647}" Sub Main() ' Licensing. ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop) Dim aoInitialize As IAoInitialize = New AoInitializeClass() Dim licenseStatus As esriLicenseStatus = aoInitialize.Initialize(esriLicenseProductCode.esriLicenseProductCodeArcInfo) If licenseStatus <> esriLicenseStatus.esriLicenseCheckedOut Then MessageBox.Show("An ArcInfo license could not be checked out.") Return End If Try ' Open the workspace. Dim workspaceFactory As IWorkspaceFactory = Nothing Select Case geodatabaseType Case GeodatabaseTypes.ArcSDE workspaceFactory = New SdeWorkspaceFactory Case GeodatabaseTypes.FileGDB workspaceFactory = New FileGDBWorkspaceFactory Case GeodatabaseTypes.PersonalGDB workspaceFactory = New AccessWorkspaceFactory End Select Dim workspace As IWorkspace = workspaceFactory.OpenFromFile(workspacePath, 0) Dim workspaceExtensionManager As IWorkspaceExtensionManager = CType(workspace, IWorkspaceExtensionManager) ' Create a UID for the workspace extension. Dim uid As UID = New UIDClass() uid.Value = extensionGuid ' Determine whether there are any existing geodatabase-register extensions. ' To disambiguate between GDB-register extensions and component category extensions, ' check the extension count of a new scratch workspace. Dim scratchWorkspaceFactory As IScratchWorkspaceFactory = New FileGDBScratchWorkspaceFactoryClass() Dim scratchWorkspace As IWorkspace = scratchWorkspaceFactory.CreateNewScratchWorkspace() Dim scratchExtensionManager As IWorkspaceExtensionManager = CType(scratchWorkspace, IWorkspaceExtensionManager) Dim workspaceExtensionApplied As Boolean = False Dim gdbRegisteredUID As UID = Nothing Try workspaceExtensionApplied = (workspaceExtensionManager.ExtensionCount > scratchExtensionManager.ExtensionCount) Catch comExc As COMException ' This is necessary in case the existing extension could not be initiated. If comExc.ErrorCode = fdoError.FDO_E_WORKSPACE_EXTENSION_CREATE_FAILED Then ' Parse the error message for the current extension's GUID. Dim regex As Regex = New Regex("(?<guid>{[^}]+})") Dim matchCollection As MatchCollection = regex.Matches(comExc.Message) If matchCollection.Count > 0 Then Dim match As Match = matchCollection(0) gdbRegisteredUID = New UIDClass() gdbRegisteredUID.Value = match.Groups("guid").Value workspaceExtensionApplied = True Else Throw comExc End If Else Throw comExc End If End Try If workspaceExtensionApplied Then If gdbRegisteredUID Is Nothing Then ' There is GDB-registered extension on the SDE workspace. Find the SDE extension that is not ' applied to the scratch workspace. Dim i As Integer = 0 For i = 0 To workspaceExtensionManager.ExtensionCount - 1 Dim workspaceExtension As IWorkspaceExtension = workspaceExtensionManager.Extension(i) Dim scratchExtension As IWorkspaceExtension = scratchExtensionManager.FindExtension(workspaceExtension.GUID) If scratchExtension Is Nothing Then gdbRegisteredUID = workspaceExtension.GUID End If Next i End If ' If the extension could be located, remove it. If Not gdbRegisteredUID Is Nothing Then workspaceExtensionManager.UnRegisterExtension(gdbRegisteredUID) End If End If ' Register the extension. workspaceExtensionManager.RegisterExtension("RasterSyncExtensionVB.RasterSyncWorkspaceExtension", uid) Catch comExc As COMException Select Case comExc.ErrorCode Case fdoError.FDO_E_WORKSPACE_EXTENSION_NO_REG_PRIV MessageBox.Show("The connection file's privileges are insufficient to perform this operation.", _ "Register Workspace Extension", MessageBoxButtons.OK, MessageBoxIcon.Error) Case fdoError.FDO_E_WORKSPACE_EXTENSION_CREATE_FAILED Dim createErrorMessage As String = String.Concat("The workspace extension could not be created.", _ Environment.NewLine, "Ensure that it has been registered for COM Interop.") MessageBox.Show(createErrorMessage, "Register Workspace Extension", MessageBoxButtons.OK, MessageBoxIcon.Error) Case fdoError.FDO_E_WORKSPACE_EXTENSION_DUP_GUID Case fdoError.FDO_E_WORKSPACE_EXTENSION_DUP_NAME Dim dupErrorMessage As String = String.Concat("A duplicate name or GUID was detected. Make sure any existing GDB-registered", _ "workspaces are not component category-registered as well.") MessageBox.Show(dupErrorMessage, "Register Workspace Extension", MessageBoxButtons.OK, MessageBoxIcon.Error) Case Else Dim otherErrorMessage As String = String.Format("An unexpected error has occurred:{0}{1}{2}", Environment.NewLine, comExc.Message, _ comExc.ErrorCode) MessageBox.Show(otherErrorMessage) End Select Catch exc As Exception Dim errorMessage As String = String.Format("An unexpected error has occurred:{0}{1}", Environment.NewLine, exc.Message) MessageBox.Show(errorMessage) End Try ' Shutdown the AO initializer. aoInitialize.Shutdown() End Sub Public Enum GeodatabaseTypes ArcSDE = 0 FileGDB = 1 PersonalGDB = 2 End Enum End Module