diff --git a/.gitmodules b/.gitmodules
index e58adb63..42eb6582 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,3 +10,6 @@
[submodule "BurnOutSharp/External/stormlibsharp"]
path = BurnOutSharp/External/stormlibsharp
url = https://github.com/robpaveza/stormlibsharp.git
+[submodule "BurnOutSharp/External/WixToolset"]
+ path = BurnOutSharp/External/WixToolset
+ url = https://github.com/wixtoolset/Dtf.git
diff --git a/BurnOutSharp/BurnOutSharp.csproj b/BurnOutSharp/BurnOutSharp.csproj
index 06590270..93c4fc73 100644
--- a/BurnOutSharp/BurnOutSharp.csproj
+++ b/BurnOutSharp/BurnOutSharp.csproj
@@ -40,7 +40,12 @@
External\libmspack4n\lib\**\*;
External\libmspack4n\libmspack4ntest\**\*;
External\stormlibsharp\lib\**;
- External\stormlibsharp\TestConsole\**
+ External\stormlibsharp\TestConsole\**;
+ External\WixToolset\src\Samples\**;
+ External\WixToolset\src\Tools\**;
+ External\WixToolset\src\WixToolset.Dtf.MSBuild\**;
+ External\WixToolset\src\WixToolset.Dtf.Resources\**;
+ External\WixToolset\src\WixToolsetTests.*\**
diff --git a/BurnOutSharp/External/WixToolset b/BurnOutSharp/External/WixToolset
new file mode 160000
index 00000000..43e22fe9
--- /dev/null
+++ b/BurnOutSharp/External/WixToolset
@@ -0,0 +1 @@
+Subproject commit 43e22fe96a491bce75ea04a3b76b4a0e19ab0c33
diff --git a/BurnOutSharp/External/WixToolset.bak/WixToolset.Dtf.WindowsInstaller/ColumnCollection.cs b/BurnOutSharp/External/WixToolset.bak/WixToolset.Dtf.WindowsInstaller/ColumnCollection.cs
deleted file mode 100644
index 9a452da1..00000000
--- a/BurnOutSharp/External/WixToolset.bak/WixToolset.Dtf.WindowsInstaller/ColumnCollection.cs
+++ /dev/null
@@ -1,333 +0,0 @@
-// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
-
-namespace WixToolset.Dtf.WindowsInstaller
-{
- using System;
- using System.IO;
- using System.Collections;
- using System.Collections.Generic;
- using System.Text;
- using System.Diagnostics.CodeAnalysis;
-
- ///
- /// 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 - ///