/// <summary> /// Commits changes made to the database. /// </summary> public void Commit() { // Retry this call 3 times to deal with an MSI internal locking problem. const int retryWait = 300; const int retryLimit = 3; int error = 0; for (int i = 1; i <= retryLimit; ++i) { error = MsiInterop.MsiDatabaseCommit(this.Handle); if (0 == error) { return; } else { MsiException exception = new MsiException(error); // We need to see if the error code is contained in any of the strings in ErrorInfo. // Join the array together and search for the error code to cover the string array. if (!String.Join(", ", exception.ErrorInfo).Contains(STG_E_LOCKVIOLATION.ToString())) { break; } Console.Error.WriteLine(String.Format("Failed to create the database. Info: {0}. Retrying ({1} of {2})", String.Join(", ", exception.ErrorInfo), i, retryLimit)); Thread.Sleep(retryWait); } } throw new MsiException(error); }