2016-04-11 13 views
1

Microsoft.Deployment.WindowsInstaller.Installer sınıfını kullanarak bir MSI paketindeki tüm özelliklerin geçerli durumlarını almaya çalıştığımda bir sorunla karşılaştım.WindowsInstaller özelliklerinin ValidStates özellikleri alınamıyor

Her FeatureInfo öğesinin ValidStates özelliğini bir Oturum içinde kopyalamak istiyorum. Ancak bunu yaparken "Sap geçersiz bir durumda." istisna. Bu değerlerin her birini Console.WriteLine() kullanarak yazdırırsam veya Visual Studio'daki kodu kullanarak adım atmazsam, bir istisna yoktur.

Bunu yapmama engel olan şeyin ne olduğu konusunda bir kayıp yapıyorum. Şimdiden teşekkürler!

Benim Kod:

var featureDictionary = new Dictionary<string, string[]>(); 

if (string.IsNullOrWhiteSpace(mPath)) 
    return featureDictionary; 

try 
{ 
    Installer.SetInternalUI(InstallUIOptions.Silent); 
    using (var session = Installer.OpenPackage(mPath, true)) 
    {   
     foreach (var feature in session.Features) 
     { 
      try 
      { 
       var states = feature.ValidStates.Select((state) => state.ToString()); 
       featureDictionary.Add(feature.Name, states.ToArray()); 
      } 
      catch (InstallerException ex) 
      { 
       Debug.WriteLine(ex.Message); 
      } 
     } 
    } 
} 
catch (InstallerException) { } 

return featureDictionary; 

cevap

0

temel problem bir dosya olarak MSI açıyoruz olduğunu görünüyor. Beyanını ya da nasıl kurulduğunu göstermediğiniz için, mpath'ın dosyanın yolu olduğunu varsayardım. OpenPackage yöntem parametreleriniz de bunu belirtiyor gibi görünüyor. MSI dosyasını gerçek yükleme sırasında bir dosya olarak açmaya ve başarısız olmaya çalıştığınız için bu hatayı alıyorsunuz.

Çalışan yükleme için veritabanını tutmanın yolu Session.Database kullanmaktır.

Çalışan MSI'yi yükleme sırasında bir dosya olarak açamazsınız, aynı sebepten dolayı, basit bir dosya paylaşımı ihlali olan Orca ile açtığınız bir MSI dosyasını çalıştıramazsınız. Visual Studio ile adım attığınızda sadece statik dosyaya erişiyor ve varsayılan değerler alıyorsunuz ve dosya bir yükleme için kullanılmıyor. Diğer bir sorun, her işlem için yalnızca bir Oturum nesnesi olabileceğidir (OpenPackage belgelerinin söylediği gibi) ve zaten yükleme işleminin tanıtıcısıyla ilişkilendirilmiş bir Oturum nesnesi varken ikinci tanesini almaya çalışıyorsunuzdur. Özel bir işlem olarak CostFinalize işleminden sonra sıralanması gerekir.

! Özellik durumu durumu gibi Windows Installer koşullu ifadeleri, özelliğin hangi durumda olduğunu söyleyecektir, çünkü genellikle Windows Installer'ın size yanıt vermesi gereken kodlardan kaçınmak daha iyidir.

+0

MSI'yi neden dosya olarak açamıyorum? – JaredSibson

+0

Özellik durumlarının çalışan yüklemeden olmasını istiyorsunuz - disk üzerinde sabit bir MSI dosyası açarak, çalıştırdığınız veya başka bir rasgele MSI dosyası olsun bunu elde edemezsiniz. Geçerli çalışan yükleme işleminin tanıtıcısını kullanarak bunu, geçerli * yükleme * veritabanını tüm değişen dinamik durumları ile ilişkilendirmek için kullandığı tam olarak budur. – PhilDW

+0

Ama değerleri yazdırırsam onlara erişebilirim. Yaptığım şeyin farkında eksik olan bir şey yok mu? – JaredSibson

İlgili konular