diff --git a/BurnOutSharp/BurnOutSharp.csproj b/BurnOutSharp/BurnOutSharp.csproj
index ff308869..69283086 100644
--- a/BurnOutSharp/BurnOutSharp.csproj
+++ b/BurnOutSharp/BurnOutSharp.csproj
@@ -1,7 +1,7 @@
+ /// Set this value for all components belonging to a feature to prevent the feature from being run-from-network or
+ /// run-from-source. Note that if a feature has no components, the feature always shows run-from-source and
+ /// run-from-my-computer as valid options.
+ ///
+ /// Set this bit for all components belonging to a feature to prevent the feature from being run-from-my-computer.
+ /// Note that if a feature has no components, the feature always shows run-from-source and run-from-my-computer
+ /// as valid options.
+ ///
+ /// If the Value field of the corresponding record in the Registry table is null, the Name field in that record
+ /// must not contain "+", "-", or "*". For more information, see the description of the Name field in Registry
+ /// table.
+ /// Setting this bit is recommended for registry entries written to the HKCU hive. This ensures the installer
+ /// writes the necessary HKCU registry entries when there are multiple users on the same machine.
+ /// Use this flag only for components that are being registered by the Registry table. Do not use this flag for + /// components registered by the AppId, Class, Extension, ProgId, MIME, and Verb tables. + ///
+ /// If this is a 64-bit component replacing a 32-bit component, set this bit and assign a new GUID in the + /// ComponentId column. + ///
+ /// If this bit is set, the Windows Installer calls the RegDisableReflectionKey on each key being accessed by the component. + /// This bit is available with Windows Installer version 4.0 and is ignored on 32-bit systems. + ///
+ /// If a subsequent patch is installed, marked with the SupersedeEarlier flag in its MsiPatchSequence + /// table to supersede the first patch, Windows Installer 4.5 can unregister and uninstall components marked with the + /// UninstallOnSupersedence value. If the component is not marked with this bit, installation of a superseding patch can leave + /// behind an unused component on the computer. + ///
+ /// A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource,
+ /// is installed locally. Components marked
+ /// A component shared by two or more features, some of which are set to FavorLocal and some to FavorSource,
+ /// is installed to run locally. Components marked
+ /// Omit this attribute and the feature state is determined according to DisallowAdvertise and + /// FavorLocal and FavorSource. + ///
To guarantee that the child feature's state always follows the state of its parent, even when the + /// child and parent are initially set to absent in the SelectionTree control, you must include both + /// FollowParent and UIDisallowAbsent in the attributes of the child feature.
+ ///Note that if you set FollowParent without setting UIDisallowAbsent, the installer cannot force + /// the child feature out of the absent state. In this case, the child feature matches the parent's + /// installation state only if the child is set to something other than absent.
+ ///Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.
+ ///+ /// If the feature is listed by the ADDDEFAULT property this bit is ignored and the feature state is determined + /// according to FavorLocal and FavorSource. + ///
Omit this attribute and the feature state is determined according to DisallowAdvertise and FavorLocal + /// and FavorSource.
+ ///+ /// Note that this bit works only with features that are listed by the ADVERTISE property. + ///
Set this attribute and if the listed feature is not a parent or child, the feature is installed according to + /// FavorLocal and FavorSource.
+ ///Set this attribute for the parent of a listed feature and the parent is installed.
+ ///Set this attribute for the child of a listed feature and the state of the child is Absent.
+ ///Omit this attribute and if the listed feature is not a parent or child, the feature state is Advertise.
+ ///Omit this attribute and if the listed feature is a parent or child, the state of both features is Advertise.
+ ///+ /// Omit this attribute and the user interface displays an option to change the feature state to Absent. + ///
Set FollowParent and UIDisallowAbsent to ensure a child feature follows the state of the parent feature.
+ ///Setting this attribute not only affects the UI, but also forces the feature to the install state whether + /// the feature is visible in the UI or not.
+ ///
+ /// Examples:
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// Win32 MSI API: + /// MsiGetComponentState + ///
+ /// Win32 MSI APIs: + /// MsiGetComponentState, + /// MsiSetComponentState + ///
+ /// Win32 MSI API: + /// MsiEnumComponentCosts + ///
+ /// Win32 MSI API: + /// MsiEnumComponents + ///
+ /// Win32 MSI API: + /// MsiEnumComponentsEx + ///
+ /// Win32 MSI API: + /// MsiGetProductCode + ///
+ /// Because clients are not ordered, any new component has an arbitrary index. + /// This means that the property may return clients in any order. + ///
+ /// Win32 MSI API: + /// MsiEnumClients, + /// MsiEnumClientsEx + ///
+ /// Win32 MSI API: + /// MsiGetComponentPath, + /// MsiGetComponentPathEx + ///
+ /// If the component is a registry key, the registry roots are represented numerically. + /// For example, a registry path of "HKEY_CURRENT_USER\SOFTWARE\Microsoft" would be returned + /// as "01:\SOFTWARE\Microsoft". The registry roots returned are defined as follows: + /// HKEY_CLASSES_ROOT=00, HKEY_CURRENT_USER=01, HKEY_LOCAL_MACHINE=02, HKEY_USERS=03, + /// HKEY_PERFORMANCE_DATA=04 + ///
+ /// Win32 MSI APIs: + /// MsiGetComponentPath, + /// MsiGetComponentPathEx, + /// MsiLocateComponent + ///
+ /// Because qualifiers are not ordered, any new qualifier has an arbitrary index, + /// meaning the function can return qualifiers in any order. + ///
+ /// Win32 MSI API: + /// MsiEnumComponentQualifiers + ///
+ /// Win32 MSI API: + /// MsiEnumComponentQualifiers + ///
+ /// A custom action method must be defined as public and static,
+ /// take a single
+ /// The
+ /// The client can use the following procedure for data access:
+ ///
+ ///
+ /// Because this constructor initiates database access, it cannot be used with a + /// running installation. + ///
+ /// The Database object should be
+ /// Win32 MSI API: + /// MsiOpenDatabase + ///
+ /// When a database is opened as the output of another database, the summary information stream + /// of the output database is actually a read-only mirror of the original database and thus cannot + /// be changed. Additionally, it is not persisted with the database. To create or modify the + /// summary information for the output database it must be closed and re-opened. + ///
+ /// The Database object should be
+ /// The database is opened in
+ /// Win32 MSI API: + /// MsiOpenDatabase + ///
+ /// Because this constructor initiates database access, it cannot be used with a + /// running installation. + ///
+ /// The database object should be
+ /// A database opened in
+ /// Win32 MSI API: + /// MsiOpenDatabase + ///
+ /// Win32 MSI API: + /// MsiGetDatabaseState + ///
+ /// Getting or setting the code page is a slow operation because it involves an export or import + /// of the codepage data to/from a temporary file. + ///
+ /// The object returned from this property does not need to be explicitly persisted or closed. + /// Any modifications will be automatically saved when the database is committed. + ///
+ /// Win32 MSI API: + /// MsiGetSummaryInformation + ///
+ /// This method is only provided for interop purposes. A Database object
+ /// should normally be obtained from
+ /// Once an item is scheduled, it cannot be unscheduled. + ///
+ /// The items cannot be deleted if the Database object is auto-disposed by the + /// garbage collector; the handle must be explicitly closed. + ///
+ /// Files which are read-only or otherwise locked cannot be deleted, + /// but they will not cause an exception to be thrown. + ///
+ /// Merge does not copy over embedded cabinet files or embedded transforms from the + /// reference database into the target database. Embedded data streams that are listed in the + /// Binary table or Icon table are copied from the reference database to the target database. + /// Storage embedded in the reference database are not copied to the target database. + ///
+ /// The Merge method merges the data of two databases. These databases must have the same + /// codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists + /// if the data in any row in the first database differs from the data in the corresponding row + /// of the second database. Corresponding rows are in the same table of both databases and have + /// the same primary key in both databases. The tables of non-conflicting databases must have + /// the same number of primary keys, same number of columns, same column types, same column names, + /// and the same data in rows with identical primary keys. Temporary columns however don't matter + /// in the column count and corresponding tables can have a different number of temporary columns + /// without creating conflict as long as the persistent columns match. + ///
+ /// If the number, type, or name of columns in corresponding tables are different, the + /// schema of the two databases are incompatible and the installer will stop processing tables + /// and the merge fails. The installer checks that the two databases have the same schema before + /// checking for row merge conflicts. If the schemas are incompatible, the databases have be + /// modified. + ///
+ /// If the data in particular rows differ, this is a row merge conflict, the merge fails + /// and creates a new table with the specified name. The first column of this table is the name + /// of the table having the conflict. The second column gives the number of rows in the table + /// having the conflict. + ///
+ /// Win32 MSI API: + /// MsiDatabaseMerge + ///
+ /// MsiDatabaseMerge does not copy over embedded cabinet files or embedded transforms from + /// the reference database into the target database. Embedded data streams that are listed in + /// the Binary table or Icon table are copied from the reference database to the target database. + /// Storage embedded in the reference database are not copied to the target database. + ///
+ /// The Merge method merges the data of two databases. These databases must have the same + /// codepage. The merge fails if any tables or rows in the databases conflict. A conflict exists + /// if the data in any row in the first database differs from the data in the corresponding row + /// of the second database. Corresponding rows are in the same table of both databases and have + /// the same primary key in both databases. The tables of non-conflicting databases must have + /// the same number of primary keys, same number of columns, same column types, same column names, + /// and the same data in rows with identical primary keys. Temporary columns however don't matter + /// in the column count and corresponding tables can have a different number of temporary columns + /// without creating conflict as long as the persistent columns match. + ///
+ /// If the number, type, or name of columns in corresponding tables are different, the + /// schema of the two databases are incompatible and the installer will stop processing tables + /// and the merge fails. The installer checks that the two databases have the same schema before + /// checking for row merge conflicts. If the schemas are incompatible, the databases have be + /// modified. + ///
+ /// Win32 MSI API: + /// MsiDatabaseMerge + ///
+ /// To check whether a table exists regardless of persistence,
+ /// use
+ /// Win32 MSI API: + /// MsiDatabaseIsTablePersistent + ///
+ /// To check whether a column exists regardless of persistence,
+ /// use
+ /// For a database open in
+ /// For a database open in
+ /// For a database open in
+ /// Win32 MSI API: + /// MsiDatabaseCommit + ///
+ /// Win32 MSI API: + /// MsiDatabaseExport + ///
+ /// Win32 MSI API: + /// MsiDatabaseImport + ///
+ /// The directory will be created if it does not already exist. + ///
+ /// Win32 MSI API: + /// MsiDatabaseExport + ///
+ /// Win32 MSI API: + /// MsiDatabaseImport + ///
+ /// This method is equivalent to directly calling the
+ /// The Record object should be
+ /// Win32 MSI API: + /// MsiCreateRecord + ///
+ /// The
+ /// The View object should be
+ /// Win32 MSI API: + /// MsiDatabaseOpenView + ///
+ /// The
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute + ///
+ /// The
+ /// Multiple rows columns will be collapsed into a single one-dimensional list. + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// Multiple rows columns will be collapsed into a single one-dimensional list. + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// The
+ /// Multiple rows columns will be collapsed into a single one-dimensional list. + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// Multiple rows columns will be collapsed into a single one-dimensional list. + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// The
+ /// Multiple rows columns will be collapsed into a single on-dimensional list. + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// Multiple rows columns will be collapsed into a single on-dimensional list. + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// The
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// Win32 MSI APIs: + /// MsiDatabaseOpenView, + /// MsiViewExecute, + /// MsiViewFetch + ///
+ /// A transform can add non-primary key columns to the end of a table. A transform cannot + /// be created that adds primary key columns to a table. A transform cannot be created that + /// changes the order, names, or definitions of columns. + ///
+ /// If the transform is to be applied during an installation you must use the
+ ///
+ /// Win32 MSI API: + /// MsiDatabaseGenerateTransform + ///
+ /// Win32 MSI API: + /// MsiCreateTransformSummaryInfo + ///
+ /// Win32 MSI API: + /// MsiDatabaseApplyTransform + ///
+ /// Win32 MSI API: + /// MsiDatabaseApplyTransform + ///
+ /// Win32 MSI API: + /// MsiDatabaseApplyTransform + ///
+ /// If the record is passed to
+ /// The following methods and properties may report extended error data:
+ ///
+ ///
+ ///
+ /// The Record object should be
+ /// Win32 MSI API: + /// MsiGetLastErrorRecord + ///
+ /// To restore the previous UI handler, a second call is made to SetExternalUI using the
+ /// ExternalUIHandler returned by the first call to SetExternalUI and specifying
+ ///
+ /// The external user interface handler does not have full control over the external user
+ /// interface unless
+ /// SetExternalUI should only be called from a bootstrapping application. You cannot call + /// it from a custom action + ///
+ /// Win32 MSI API: + /// MsiSetExternalUI + ///
+ /// To restore the previous UI handler, a second call is made to SetExternalUI using the
+ /// ExternalUIHandler returned by the first call to SetExternalUI and specifying
+ ///
+ /// The external user interface handler does not have full control over the external user
+ /// interface unless
+ /// SetExternalUI should only be called from a bootstrapping application. You cannot call + /// it from a custom action + ///
+ /// Win32 MSI API: + /// MsiSetExternalUIRecord + ///
+ /// Win32 MSI API: + /// MsiGetFeatureState + ///
+ /// When changing the feature action, the action state of all the Components linked to the changed + /// Feature records are also updated appropriately, based on the new feature Select state. + /// All Features can be configured at once by specifying the keyword ALL instead of a specific feature name. + ///
+ /// Win32 MSI APIs: + /// MsiGetFeatureState, + /// MsiSetFeatureState + ///
+ /// Win32 MSI API: + /// MsiGetFeatureValidStates + ///
+ /// Win32 MSI APIs: + /// MsiGetFeatureInfo, + /// MsiSetFeatureAttributes + ///
+ /// Since the lpAttributes paramter of
+ /// MsiGetFeatureInfo
+ /// does not contain an equivalent flag for
+ /// Since the dwAttributes parameter of
+ /// MsiSetFeatureAttributes
+ /// does not contain an equivalent flag for
+ /// Win32 MSI API: + /// MsiGetFeatureInfo + ///
+ /// Win32 MSI API: + /// MsiGetFeatureInfo + ///
+ /// Win32 MSI API: + /// MsiGetFeatureCost + ///
+ /// Win32 MSI API: + /// MsiQueryFeatureState + ///
+ /// If no usage metrics are recorded, the
+ /// Win32 MSI API: + /// MsiGetFeatureUsage + ///
+ /// These classes implement the
+ /// The finalizer of this class will NOT close the handle if it is still open, + /// because finalization can run on a separate thread from the application, + /// resulting in potential problems if handles are closed from that thread. + /// It is best that the handle be closed manually as soon as it is no longer needed, + /// as leaving lots of unused handles open can degrade performance. + ///
+ /// Win32 MSI API: + /// MsiCloseHandle + ///
+ /// The finalizer of this class will NOT close the handle if it is still open, + /// because finalization can run on a separate thread from the application, + /// resulting in potential problems if handles are closed from that thread. + /// It is best that the handle be closed manually as soon as it is no longer needed, + /// as leaving lots of unused handles open can degrade performance. + ///
+ /// This method is merely an alias for the
+ /// Win32 MSI API: + /// MsiCloseHandle + ///
+ /// The hash code is derived from the native integer handle. + ///
+ /// Win32 MSI API: + /// InitializeEmbeddedUI + ///
+ /// Win32 MSI API: + /// EmbeddedUIHandler + ///
+ /// Win32 MSI API: + /// ShutdownEmbeddedUI + ///
+ /// This temporary space requirement is space needed only for the duration + /// of the installation, over the final footprint on disk. + ///
+/// If
+/// The
+ /// Win32 MSI API: + /// MsiSetInternalUI + ///
+ /// Win32 MSI API: + /// MsiSetInternalUI + ///
+ /// This method takes effect on any new installation processes. Calling this + /// method from within a custom action will not start logging for that installation. + ///
+ /// Win32 MSI API: + /// MsiEnableLog + ///
+ /// The UseFeature method should only be used on features known to be published. The application + /// should determine the status of the feature by calling either the FeatureState method or + /// Features method. + ///
+ /// Win32 MSI APIs: + /// MsiUseFeature, + /// MsiUseFeatureEx + ///
+ /// Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a + /// custom action because the active installation is the only session allowed. + ///
+ /// A "safe" Session object ignores the current computer state when opening the package and prevents + /// changes to the current computer state. + ///
+ /// The Session object should be
+ /// Win32 MSI APIs: + /// MsiOpenPackage, + /// MsiOpenPackageEx + ///
+ /// Note that only one Session object can be opened by a single process. OpenPackage cannot be used in a + /// custom action because the active installation is the only session allowed. + ///
+ /// A "safe" Session object ignores the current computer state when opening the package and prevents + /// changes to the current computer state. + ///
+ /// The Session object should be
+ /// Win32 MSI APIs: + /// MsiOpenPackage, + /// MsiOpenPackageEx + ///
+ /// Note that only one Session object can be opened by a single process. OpenProduct cannot be + /// used in a custom action because the active installation is the only session allowed. + ///
+ /// The Session object should be
+ /// Win32 MSI API: + /// MsiOpenProduct + ///
+ /// Win32 MSI API: + /// MsiProvideComponent + ///
+ /// Win32 MSI APIs: + /// MsiProvideQualifiedComponent + /// MsiProvideQualifiedComponentEx + ///
+ /// Win32 MSI API: + /// MsiProvideAssembly + ///
+ /// Win32 MSI API: + /// MsiInstallMissingComponent + ///
+ /// Win32 MSI API: + /// MsiInstallMissingFile + ///
+ /// Win32 MSI API: + /// MsiReinstallFeature + ///
+ /// Win32 MSI API: + /// MsiReinstallProduct + ///
+ /// To completely remove a product, set REMOVE=ALL in
+ /// This method displays the user interface with the current settings and
+ /// log mode. You can change user interface settings with the
+ /// The
+ /// Win32 MSI API: + /// MsiInstallProduct + ///
+ /// This method displays the user interface with the current settings and
+ /// log mode. You can change user interface settings with the
+ /// The
+ /// Win32 MSI APIs: + /// MsiConfigureProduct, + /// MsiConfigureProductEx + ///
+ /// The
+ /// Win32 MSI API: + /// MsiConfigureFeature + ///
+ /// The
+ /// Win32 MSI API: + /// MsiApplyPatch + ///
+ /// The
+ /// Win32 MSI API: + /// MsiApplyPatch + ///
+ /// The
+ /// Win32 MSI API: + /// MsiRemovePatches + ///
+ /// If an item in
+ /// As this overload uses InstallContext.None, it does not consider the current state of + /// the system. + ///
+ /// Win32 MSI API: + /// MsiDetermineApplicablePatches + ///
+ /// If an item in
+ /// Passing an InstallContext of None only analyzes the MSI file; it does not consider the + /// current state of the system. You cannot use InstallContext.None with a ProductCode GUID. + ///
+ /// Win32 MSI APIs: + /// MsiDetermineApplicablePatches + /// MsiDeterminePatchSequence + ///
+ /// Win32 MSI API: + /// MsiApplyMultiplePatches + ///
+ /// Win32 MSI API: + /// MsiExtractPatchXMLData + ///
+ /// Win32 MSI API: + /// MsiNotifySidChange + ///
+ /// Win32 MSI APIs: + /// MsiAdvertiseProduct, + /// MsiAdvertiseProductEx + ///
+ /// Win32 MSI APIs: + /// MsiAdvertiseProduct, + /// MsiAdvertiseProductEx + ///
+ /// Win32 MSI APIs: + /// MsiAdvertiseProduct, + /// MsiAdvertiseProductEx + ///
+ /// The process calling this function must be running under the LocalSystem account. To advertise an + /// application for per-user installation to a targeted user, the thread that calls this function must + /// impersonate the targeted user. If the thread calling this function is not impersonating a targeted + /// user, the application is advertised to all users for installation with elevated privileges. + ///
+ /// The process calling this function must be running under the LocalSystem account. To advertise an + /// application for per-user installation to a targeted user, the thread that calls this function must + /// impersonate the targeted user. If the thread calling this function is not impersonating a targeted + /// user, the application is advertised to all users for installation with elevated privileges. + ///
+ /// Win32 MSI API: + /// MsiProcessAdvertiseScript + ///
+ /// Only the following properties will be filled in in the returned object:
+ /// Win32 MSI API: + /// MsiGetProductInfoFromScript + ///
+ /// The returned string may have tokens such as [2] and [3] that are meant to be substituted + /// with context-specific values. + ///
+ /// Error numbers greater than 2000 refer to MSI "internal" errors, and are always + /// returned in English. + ///
+ /// The returned string may have tokens such as [2] and [3] that are meant to be substituted + /// with context-specific values. + ///
+ /// Error numbers greater than 2000 refer to MSI "internal" errors, and are always + /// returned in English. + ///
+ /// Error numbers greater than 2000 refer to MSI "internal" errors, and are always + /// returned in English. + ///
+ /// Error numbers greater than 2000 refer to MSI "internal" errors, and are always + /// returned in English. + ///
+ /// Win32 MSI API: + /// MsiGetFileVersion + ///
+ /// Win32 MSI API: + /// MsiGetFileVersion + ///
+ /// Win32 MSI API: + /// MsiGetFileHash + ///
+ /// Win32 MSI API: + /// MsiGetShortcutTarget + ///
+ /// Win32 MSI API: + /// MsiVerifyPackage + ///
+ /// Win32 MSI API: + /// MsiGetPatchFileList + ///
+ /// Win32 MSI API: + /// MsiEnumPatches + ///
+ /// Win32 MSI APIs: + /// MsiEnumPatchesEx + ///
+ /// All available user contexts will be queried. + ///
+ /// If the
+ /// This value may not be available for per-user, non-managed applications + /// if the user is not logged on. + ///
+ /// Even if this property is true, the installer can still block the + /// uninstallation if this patch is required by another patch that + /// cannot be uninstalled. + ///
+ /// Win32 MSI APIs: + /// MsiGetPatchInfo, + /// MsiGetPatchInfoEx + ///
+ /// Win32 MSI API: + /// MsiEnumRelatedProducts + ///
+ /// Win32 MSI API: + /// MsiEnumProducts, + ///
+ /// Win32 MSI API: + /// MsiEnumProductsEx + ///
+ /// All available user contexts will be queried. + ///
+ /// Because features are not ordered, any new feature has an arbitrary index, meaning + /// this property can return features in any order. + ///
+ /// Win32 MSI API: + /// MsiEnumFeatures + ///
+ /// Note that this property does not take into account policies such as AlwaysInstallElevated, + /// but verifies that the local system owns the product's registry data. + ///
+ /// For more information, see + /// ProductID + ///
+ /// Win32 MSI APIs: + /// MsiGetProductInfo, + /// MsiGetProductInfoEx + ///
+ /// Win32 MSI APIs: + /// MsiQueryFeatureState, + /// MsiQueryFeatureStateEx + ///
+ /// Win32 MSI API: + /// MsiQueryComponentState + ///
+ /// This method is typically called by an application during the first run of the application. The application
+ /// first gets the
+ /// The CollectUserInfo method invokes a FirstRun dialog from the product installation database. + ///
+ /// Win32 MSI API: + /// MsiCollectUserInfo + ///
+ /// Most methods on the Record class have overloads that allow using either a number + /// or a name to designate a field. However note that field names only exist when the + /// Record is directly returned from a query on a database. For other records, attempting + /// to access a field by name will result in an InvalidOperationException. + ///
+ /// The Record object should be
+ /// Win32 MSI API: + /// MsiCreateRecord + ///
+ /// The Record object should be
+ /// Win32 MSI API: + /// MsiCreateRecord + ///
+ /// Win32 MSI API: + /// MsiRecordGetFieldCount + ///
+ /// When getting a field, the type of the object returned depends on the type of the Record field. + /// The object will be one of: Int16, Int32, String, Stream, or null. + ///
+ /// When setting a field, the type of the object provided will be converted to match the View + /// query that returned the record, or if Record was not returned from a view then the type of + /// the object provided will determine the type of the Record field. The object should be one of: + /// Int16, Int32, String, Stream, or null. + ///
+ /// Record fields are indexed starting with 1. Field 0 is a special format field. + ///
+ /// When getting a field, the type of the object returned depends on the type of the Record field. + /// The object will be one of: Int16, Int32, String, Stream, or null. If the Record was returned + /// from a View, the type will match that of the field from the View query. Otherwise, the type + /// will match the type of the last value set for the field. + ///
+ /// When setting a field, the type of the object provided will be converted to match the View + /// query that returned the Record, or if Record was not returned from a View then the type of + /// the object provided will determine the type of the Record field. The object should be one of: + /// Int16, Int32, String, Stream, or null. + ///
+ /// The type-specific getters and setters are slightly more efficient than this property, since + /// they don't have to do the extra work to infer the value's type every time. + ///
+ /// Win32 MSI APIs: + /// MsiRecordGetInteger, + /// MsiRecordGetString, + /// MsiRecordSetInteger, + /// MsiRecordSetString + ///
+ /// This method is only provided for interop purposes. A Record object
+ /// should normally be obtained by calling
The handle will be closed when this object is disposed or finalized.
+ ///+ /// Win32 MSI API: + /// MsiRecordClearData + ///
+ /// Win32 MSI API: + /// MsiRecordIsNull + ///
+ /// The returned data size is 0 if the field is null, non-existent, + /// or an internal object pointer. The method also returns 0 if the handle is not a valid + /// Record handle. + ///
+ /// If the data is in integer format, the property returns 2 or 4. + ///
+ /// If the data is in string format, the property returns the character count + /// (not including the NULL terminator). + ///
+ /// If the data is in stream format, the property returns the byte count. + ///
+ /// Win32 MSI API: + /// MsiRecordDataSize + ///
The returned data size is 0 if the field is null, non-existent, + /// or an internal object pointer. The method also returns 0 if the handle is not a valid + /// Record handle. + ///
+ /// If the data is in integer format, the property returns 2 or 4. + ///
+ /// If the data is in string format, the property returns the character count + /// (not including the NULL terminator). + ///
+ /// If the data is in stream format, the property returns the byte count. + ///
+ /// Win32 MSI API: + /// MsiRecordGetInteger + ///
+ /// Win32 MSI API: + /// MsiRecordGetInteger + ///
+ /// Win32 MSI API: + /// MsiRecordSetInteger + ///
+ /// Win32 MSI API: + /// MsiRecordSetInteger + ///
+ /// Win32 MSI API: + /// MsiRecordGetString + ///
+ /// Win32 MSI API: + /// MsiRecordSetString + ///
+ /// This method is capable of directly extracting substorages. To do so, first select both the + /// `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. + /// However, substorages may only be extracted from a database that is open in read-only mode. + ///
+ /// Win32 MSI API: + /// MsiRecordReadStream + ///
+ /// This method is capable of directly extracting substorages. To do so, first select both the + /// `Name` and `Data` column of the `_Storages` table, then get the stream of the `Data` field. + /// However, substorages may only be extracted from a database that is open in read-only mode. + ///
+ /// This method is not capable of reading substorages. To extract a substorage,
+ /// use
+ /// Win32 MSI API: + /// MsiRecordReadStream + ///
+ /// This method is not capable of reading substorages. To extract a substorage,
+ /// use
+ /// The contents of the specified file are read into a stream object. The stream persists if + /// the Record is inserted into the Database and the Database is committed. + ///
+ /// To reset the stream to its beginning you must pass in null for filePath. + /// Do not pass an empty string, "", to reset the stream. + ///
+ /// Setting a stream with this method is more efficient than setting a field to a + /// FileStream object. + ///
+ /// Win32 MSI API: + /// MsiRecordsetStream + ///
+ /// The contents of the specified file are read into a stream object. The stream persists if + /// the Record is inserted into the Database and the Database is committed. + /// To reset the stream to its beginning you must pass in null for filePath. + /// Do not pass an empty string, "", to reset the stream. + ///
+ /// Setting a stream with this method is more efficient than setting a field to a + /// FileStream object. + ///
+ /// The stream persists if the Record is inserted into the Database and the Database is committed. + ///
+ /// Win32 MSI API: + /// MsiRecordsetStream + ///
+ /// The stream persists if the Record is inserted into the Database and the Database is committed. + ///
+ /// If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// If field 0 of the Record is set to a nonempty string, it is used to format the data in the Record. + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// This enumeration MUST stay in sync with the + /// unmanaged equivalent in RemoteMsiSession.h! + ///
+ /// The implementation of this delegate is provided by the + /// custom action host DLL. + ///
+ /// This object is associated with a standard set of action functions, + /// each performing particular operations on data from one or more tables. Additional + /// custom actions may be added for particular product installations. The basic engine + /// function is a sequencer that fetches sequential records from a designated sequence + /// table, evaluates any specified condition expression, and executes the designated + /// action. Actions not recognized by the engine are deferred to the UI handler object + /// for processing, usually dialog box sequences. + ///
+ /// Note that only one Session object can be opened by a single process. + ///
+ /// Normally there is no need to close this Database object. The same object can be + /// used throughout the lifetime of the Session, and it will be closed when the Session + /// is closed. + ///
+ /// Win32 MSI API: + /// MsiGetActiveDatabase + ///
+ /// Win32 MSI API: + /// MsiGetLanguage + ///
+ /// Win32 MSI APIs: + /// MsiGetProperty, + /// MsiSetProperty + ///
+ /// This method is only provided for interop purposes. A Session object
+ /// should normally be obtained by calling
+ /// Logging may be selectively enabled for the various message types.
+ /// See the
+ /// If record field 0 contains a formatting string, it is used to format the data in + /// the other fields. Else if the message is an error, warning, or user message, an attempt + /// is made to find a message template in the Error table for the current database using the + /// error number found in field 1 of the record for message types and return values. + ///
+ /// The
+ /// Note, this method never returns Cancel or Error values. Instead, appropriate + /// exceptions are thrown in those cases. + ///
+ /// Win32 MSI API: + /// MsiProcessMessage + ///
+ /// Win32 MSI API: + /// MsiProcessMessage + ///
+ /// Win32 MSI API: + /// MsiProcessMessage + ///
+ /// Win32 MSI API: + /// MsiEvaluateCondition + ///
+ /// Win32 MSI API: + /// MsiEvaluateCondition + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// Win32 MSI API: + /// MsiFormatRecord + ///
+ /// Note this is not the correct method for getting ordinary session properties. For that, + /// see the indexer on the Session class. + ///
+ /// Win32 MSI API: + /// MsiGetProductProperty + ///
+ /// Win32 MSI API: + /// MsiVerifyDiskSpace + ///
+ /// Win32 MSI API: + /// MsiEnumComponentCosts + ///
+ /// Note that only the following run modes are available to read from
+ /// a deferred custom action:
+ ///
+ ///
+ /// Win32 MSI API: + /// MsiGetMode + ///
+ /// Win32 MSI API: + /// MsiSetMode + ///
+ /// Win32 MSI API: + /// MsiGetSourcePath + ///
+ /// Win32 MSI API: + /// MsiGetTargetPath + ///
+ /// Setting the target path of a directory changes the path specification for the directory + /// in the in-memory Directory table. Also, the path specifications of all other path objects + /// in the table that are either subordinate or equivalent to the changed path are updated + /// to reflect the change. The properties for each affected path are also updated. + ///
+ /// If an error occurs in this function, all updated paths and properties revert to + /// their previous values. Therefore, it is safe to treat errors returned by this function + /// as non-fatal. + ///
+ /// Do not attempt to configure the target path if the components using those paths + /// are already installed for the current user or for a different user. Check the + /// ProductState property before setting the target path to determine if the product + /// containing this component is installed. + ///
+ /// Win32 MSI API: + /// MsiSetTargetPath + ///
+ /// The SetInstallLevel method sets the following:
+ ///
+ /// If 0 or a negative number is passed in the ilnstallLevel parameter,
+ /// the current installation level does not change, but all features are still
+ /// updated based on the current installation level.
+ ///
+ /// Win32 MSI API: + /// MsiSetInstallLevel + ///
+ /// The DoAction method executes the action that corresponds to the name supplied. If the + /// name is not recognized by the installer as a built-in action or as a custom action in + /// the CustomAction table, the name is passed to the user-interface handler object, which + /// can invoke a function or a dialog box. If a null action name is supplied, the installer + /// uses the upper-case value of the ACTION property as the action to perform. If no property + /// value is defined, the default action is performed, defined as "INSTALL". + ///
+ /// Actions that update the system, such as the InstallFiles and WriteRegistryValues + /// actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction + /// is called from a custom action that is scheduled in the InstallExecuteSequence table + /// between the InstallInitialize and InstallFinalize actions. Actions that do not update the + /// system, such as AppSearch or CostInitialize, can be called. + ///
+ /// Win32 MSI API: + /// MsiDoAction + ///
+ /// The DoAction method executes the action that corresponds to the name supplied. If the + /// name is not recognized by the installer as a built-in action or as a custom action in + /// the CustomAction table, the name is passed to the user-interface handler object, which + /// can invoke a function or a dialog box. If a null action name is supplied, the installer + /// uses the upper-case value of the ACTION property as the action to perform. If no property + /// value is defined, the default action is performed, defined as "INSTALL". + ///
+ /// Actions that update the system, such as the InstallFiles and WriteRegistryValues + /// actions, cannot be run by calling MsiDoAction. The exception to this rule is if DoAction + /// is called from a custom action that is scheduled in the InstallExecuteSequence table + /// between the InstallInitialize and InstallFinalize actions. Actions that do not update the + /// system, such as AppSearch or CostInitialize, can be called. + ///
+ /// If the called action is a deferred, rollback, or commit custom action, then the supplied
+ ///
+ /// Win32 MSI API: + /// MsiDoAction + ///
+ /// This method queries the specified table, ordering the actions by the numbers in the Sequence column. + /// For each row retrieved, an action is executed, provided that any supplied condition expression does + /// not evaluate to FALSE. + ///
+ /// An action sequence containing any actions that update the system, such as the InstallFiles and + /// WriteRegistryValues actions, cannot be run by calling DoActionSequence. The exception to this rule is if + /// DoActionSequence is called from a custom action that is scheduled in the InstallExecuteSequence table + /// between the InstallInitialize and InstallFinalize actions. Actions that do not update the system, such + /// as AppSearch or CostInitialize, can be called. + ///
+ /// Win32 MSI API: + /// MsiSequence + ///
+ /// If this method is called with a new source, the installer adds the source + /// to the end of the source list. + ///
+ /// If this method is called with a source already existing in the source + /// list, it has no effect. + ///
+ /// Win32 MSI APIs: + /// MsiSourceListAddSource, + /// MsiSourceListAddSourceEx + ///
+ /// If this method is called with a new source and
+ /// If this method is called with a source already existing in the source
+ /// list and
+ /// If the method is called with an existing source in the source list
+ /// and
+ /// If the method is called with a new source and Index is set to a
+ /// non-zero value, the source is inserted at the position specified by
+ ///
+ /// If
+ /// Win32 MSI API: + /// MsiSourceListAddSourceEx + ///
+ /// Win32 MSI API: + /// MsiSourceListClearAll + ///
+ /// Win32 MSI API: + /// MsiSourceListClearAllEx + ///
+ /// Win32 MSI API: + /// MsiSourceListClearAllEx + ///
+ /// Win32 MSI API: + /// MsiSourceListClearSource + ///
+ /// Win32 MSI API: + /// MsiSourceListEnumSources + ///
+ /// Win32 MSI APIs: + /// MsiSourceListForceResolution, + /// MsiSourceListForceResolutionEx + ///
+ ///
+ /// Win32 MSI API: + /// MsiSourceListGetInfo + ///
+ /// Win32 MSI API: + /// MsiSourceListAddMediaDisk + ///
+ /// Win32 MSI API: + /// MsiSourceListClearAllEx + ///
+ /// Win32 MSI API: + /// MsiSourceListClearMediaDisk + ///
+ /// Win32 MSI API: + /// MsiSourceListEnumMediaDisks + ///
+ /// The SummaryInfo object should be
+ /// Win32 MSI API: + /// MsiGetSummaryInformation + ///
+ /// The Title summary information property briefly describes the type of installer package. Phrases + /// such as "Installation Database" or "Transform" or "Patch" may be used for this property. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Subject summary information property conveys to a file browser the product that can be installed using + /// the logic and data in this installer database. For example, the value of the summary property for + /// Microsoft Office 97 would be "Microsoft Office 97 Professional". This value is typically set from the + /// installer property ProductName. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Author summary information property conveys to a file browser the manufacturer of the installation + /// database. This value is typically set from the installer property Manufacturer. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Keywords summary information property is used by file browsers to hold keywords that permit the + /// database file to be found in a keyword search. The set of keywords typically includes "Installer" as + /// well as product-specific keywords, and may be localized. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Comments summary information property conveys the general purpose of the installer database. By convention, + /// the value for this summary property is set to the following: + ///
+ /// "This installer database contains the logic and data required to install <product name>." + ///
+ /// where <product name> is the name of the product being installed. In general the value for this summary + /// property only changes in the product name, nothing else. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Template summary information propery indicates the platform and language versions supported by the database. + ///
+ /// The syntax of the Template Summary property information is: + /// [platform property][,platform property][,...];[language id][,language id][,...] + ///
+ /// For example, the following are all valid values for the Template Summary property:
+ ///
+ ///
+ ///
+ /// If this is a 64-bit Windows Installer, enter Intel64 in the Template summary information property. Note that an + /// installation package cannot have both the Intel and Intel64 properties set. + ///
+ /// If the current platform does not match one of the platforms specified then the installer will not process the + /// package. Not specifying a platform implies that the package is platform-independent. + ///
+ /// Entering 0 in the language ID field of the Template summary information property, or leaving this field empty, + /// indicates that the package is language neutral. + ///
+ /// There are variations of this property depending on whether it is in a source installer database or a transform. + ///
+ /// Source Installer Database - Only one language can be specified in a source installer database. Merge Modules are + /// the only packages that may have multiple languages. For more information, see Multiple Language Merge Modules. + ///
+ /// Transform - In a transform file, only one language may be specified. The specified platform and language determine + /// whether a transform can be applied to a particular database. The platform property and the language property can + /// be left blank if no transform restriction relies on them to validate the transform. + ///
+ /// This summary property is REQUIRED. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The installer sets the Last Saved By summary information property to the value of the LogonUser property during + /// an administrative installation. The installer never uses this property and a user never needs to modify it. + /// Developers of a database editing tool may use this property to track the last person to modify the database. + /// This property should be left set to null in a final shipping database. + ///
+ /// In a transform, this summary property contains the platform and language ID(s) that a database should have + /// after it has been transformed. The property specifies to what the Template should be set in the new database. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Revision Number summary information property contains the package code for the installer package. The + /// package code is a unique identifier of the installer package. + ///
+ /// The Revision Number summary information property of a patch package specifies the GUID patch code for + /// the patch. This is followed by a list of patch code GUIDs for obsolete patches that are removed when this + /// patch is applied. The patch codes are concatenated with no delimiters separating GUIDs in the list. + ///
+ /// The Revision Number summary information property of a transform package lists the product code GUIDs + /// and version of the new and original products and the upgrade code GUID. The list is separated with + /// semicolons as follows. + ///
+ /// Original-Product-Code Original-Product-Version ; New-Product Code New-Product-Version; Upgrade-Code + ///
+ /// This summary property is REQUIRED. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The CreatingApp summary information property conveys which application created the installer database. + /// In general the value for this summary property is the name of the software used to author this database. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The LastPrintTime summary information property can be set to the date and time during an administrative + /// installation to record when the administrative image was created. For non-administrative installations + /// this property is the same as the CreateTime summary information property. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The CreateTime summary information property conveys when the installer database was created. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The LastSaveTime summary information property conveys when the last time the installer database was + /// modified. Each time a user changes an installation the value for this summary property is updated to + /// the current system time/date at the time the installer database was saved. Initially the value for + /// this summary property is set to null to indicate that no changes have yet been made. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Codepage summary information property is the numeric value of the ANSI code page used for any + /// strings that are stored in the summary information. Note that this is not the same code page for + /// strings in the installation database. The Codepage summary information property is used to translate + /// the strings in the summary information into Unicode when calling the Unicode API functions. The + /// Codepage summary information property must be set before any string properties are set in the + /// summary information. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// For an installation package, the PageCount summary information property contains the minimum + /// installer version required. For Windows Installer version 1.0, this property must be set to the + /// integer 100. For 64-bit Windows Installer Packages, this property must be set to the integer 200. + ///
+ /// For a transform package, the PageCount summary information property contains minimum installer + /// version required to process the transform. Set to the greater of the two PageCount summary information + /// property values belonging to the databases used to generate the transform. + ///
+ /// The PageCount summary information property is set to null in patch packages. + ///
+ /// This summary property is REQUIRED. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The WordCount summary information property indicates the type of source file image. If this property is + /// not present, it defaults to 0. Note that this property is stored in place of the standard Count property. + ///
+ /// This property is a bit field. New bits may be added in the future. At present the following bits are
+ /// available:
+ ///
+ ///
+ ///
+ /// These are combined to give the WordCount summary information property one of the following values
+ /// indicating a type of source file image:
+ ///
+ ///
+ ///
+ /// Note that if the package is marked as compressed (bit 1 is set), the installer only installs files
+ /// located at the root of the source. In this case, even files marked as uncompressed in the File table must
+ /// be located at the root to be installed. To specify a source image that has both a cabinet file (compressed
+ /// files) and uncompressed files that match the tree in the Directory table, mark the package as uncompressed
+ /// by leaving bit 1 unset (value=0) in the WordCount summary information property and set
+ ///
+ /// For a patch package, the WordCount summary information property specifies the patch engine that was used + /// to create the patch files. The default value is 1 and indicates that MSPATCH was used to create the patch + /// A value of "2" means that the patch is using smaller, optimized, files available only with Windows Installer + /// version 1.2 or later. A patch with a WordCount of "2" fails immediately if used with a Windows Installer + /// version earlier than 1.2. A patch with a WordCount of "3" fails immediately if used with a Windows Installer + /// version earlier than 2.0. + ///
+ /// This summary property is REQUIRED. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The CharacterCount summary information property is only used in transforms. This part of the summary + /// information stream is divided into two 16-bit words. The upper word contains the transform validation + /// flags. The lower word contains the transform error condition flags. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// The Security summary information property conveys whether the package should be opened as read-only. The database
+ /// editing tool should not modify a read-only enforced database and should issue a warning at attempts to modify a
+ /// read-only recommended database. The following values of this property are applicable to Windows Installer files:
+ ///
+ ///
+ ///
+ /// This property should be set to read-only recommended (2) for an installation database and to read-only + /// enforced (4) for a transform or patch. + ///
+ /// Win32 MSI APIs: + /// MsiSummaryInfoGetProperty, + /// MsiSummaryInfoSetProperty + ///
+ /// This method may only be called once after all the property values have been set. Properties may + /// still be read after the stream is written. + ///
+ /// Win32 MSI API: + /// MsiSummaryInfoPersist + ///
+ /// This property queries the database every time it is called, + /// to ensure the returned values are up-to-date. For best performance, + /// hold onto the returned collection if using it more than once. + ///
+ /// The values are expressed as question-mark tokens, to be supplied by the record. + ///
+ /// The columns are listed explicitly in the SELECT string, as opposed to using "SELECT *". + ///
+ /// Win32 MSI APIs: + /// MsiBeginTransaction + /// MsiJoinTransaction + /// MsiEndTransaction + ///
+ /// Win32 MSI API: + /// MsiBeginTransaction + ///
+ /// Win32 MSI API: + /// MsiJoinTransaction + ///
+ /// Runs any Commit Custom Actions and commits to the system any changes to Win32 or common language + /// runtime assemblies. Deletes the rollback script, and after using this option, the transaction's + /// changes can no longer be undone with a Rollback Installation. + ///
+ /// This method can only be called by the current owner of the transaction. + ///
+ /// Win32 MSI API: + /// MsiEndTransaction + ///
+ /// This method can only be called by the current owner of the transaction. + ///
+ /// Win32 MSI API: + /// MsiEndTransaction + ///
+ /// Win32 MSI API: + /// MsiViewGetColumnInfo + ///
+ /// Win32 MSI API: + /// MsiViewExecute + ///
+ /// Win32 MSI API: + /// MsiViewExecute + ///
+ /// The Record object should be
+ /// Win32 MSI API: + /// MsiViewFetch + ///
+ /// You can update or delete a record immediately after inserting, or seeking provided you + /// have NOT modified the 0th field of the inserted or sought record. + ///
+ /// To execute any SQL statement, a View must be created. However, a View that does not + /// create a result set, such as CREATE TABLE, or INSERT INTO, cannot be used with any of + /// the Modify methods to update tables though the view. + ///
+ /// You cannot fetch a record containing binary data from one database and then use
+ /// that record to insert the data into another database. To move binary data from one database
+ /// to another, you should export the data to a file and then import it into the new database
+ /// using a query and the
+ /// Note that custom actions can only add, modify, or remove temporary rows, columns, + /// or tables from a database. Custom actions cannot modify persistent data in a database, + /// such as data that is a part of the database stored on disk. + ///
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// The Record must have been obtained by calling
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// Fails if a row with the same primary keys exists. Fails with a read-only database. + /// This method cannot be used with a View containing joins. + ///
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// Only non-primary keys can be updated. The Record must have been obtained by calling
+ ///
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// Updates record if the primary keys match an existing row and inserts if they do not match. + /// Fails with a read-only database. This method cannot be used with a View containing joins. + ///
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// The Record must have been obtained by calling
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// The Record must have been obtained by calling
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// Fails if a row with the same primary key exists. Works only with read-write records. + /// This method cannot be used with a View containing joins. + ///
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// After seeking, the Record may then be used for subsequent Update, Delete, and Refresh + /// operations. All primary key columns of the table must be in the query and the Record must + /// have at least as many fields as the query. Seek cannot be used with multi-table queries. + /// This method cannot be used with a View containing joins. + ///
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// Works only with read-write records. This method cannot be used with a + /// View containing joins. + ///
+ /// See
+ /// Win32 MSI API: + /// MsiViewModify + ///
+ /// The Record must have been obtained by calling
+ /// See
+ /// Win32 MSI APIs: + /// MsiViewModify, + /// MsiViewGetError + ///
+ /// Checks for duplicate keys. The Record must have been obtained by
+ /// calling
+ /// See
+ /// Win32 MSI APIs: + /// MsiViewModify, + /// MsiViewGetError + ///
+ /// Works with read-write and read-only records. This method cannot be used with + /// a View containing joins. + ///
+ /// See
+ /// Win32 MSI APIs: + /// MsiViewModify, + /// MsiViewGetError + ///
+ /// Validation does not check for the existence of the primary keys of this row in properties + /// or strings. Does not check if a column is a foreign key to multiple tables. Works with + /// read-write and read-only records. This method cannot be used with a View containing joins. + ///
+ /// See
+ /// Win32 MSI APIs: + /// MsiViewModify, + /// MsiViewGetError + ///
+ /// Each Record object should be
+ /// Win32 MSI API: + /// MsiViewFetch + ///