سؤال

هل هناك أي طريقة لقراءة الخصائص داخل ملف msi؟

على سبيل المثال، نظرا لاسم ملف MSI Testpackage.msi

اريد ان اجد

productName
PackageCode
version

سأستخدمه مع إلغاء تثبيت WMI

string objPath = string.Format("Win32_Product.IdentifyingNumber='{0}',Name='{1}',Version='{2}'", "{AC9C1263-2BA8-4863-BE18-01232375CE42}", "testproduct", "10.0.0.0");

تحديث:يعد استخدام Orca خيارًا رائعًا، إذا كان من الممكن تحقيق ذلك برمجيًا، فيمكنني استخدامه لإنشاء ملاحظات الإصدار التلقائية.وفي برنامج إلغاء التثبيت أيضًا.

هل كانت مفيدة؟

المحلول

ويمكنك استخدام API COM القائم للعمل مع MSI ، وتفعل شيئا مثل

Function GetVersion(ByVal msiName)

    Const msiOpenDatabaseModeReadOnly = 0
    Dim msi, db, view

    Set msi = CreateObject("WindowsInstaller.Installer")
    Set db = msi.OpenDataBase(msiName, msiOpenDatabaseModeReadOnly)
    Set view = db.OpenView("SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'")
    Call view.Execute()

    GetVersion = view.Fetch().StringData(1)

End Function

نصائح أخرى

ويمكنك استخدام مايكروسوفت Orca.exe . سوف أرك تسمح لك لفتح MSI وتحرير / عرض كافة الجداول في ذلك. سيكون لديك لتحميل ويندوز SDK في من أجل الحصول عليها، ولكن الحمد لله هذا هو حر.

وبديل واحد (والذي قد يكون أسرع نظرا لحجم التحميل من SDK) هو استخدام dark.exe من WIX مشروع . الظلام هو المنقح MSI، التي ستصدر كل شيء في ملف XML وجمع الموارد. سوف مخرجات ذلك XML لديهم المعلومات التي يبحثون عنها.

أريد فقط أن أذكر أن الأمور أصبحت أسهل الآن. يوجد غلاف .NET كامل لنموذج كائن Windows Installer، بحيث يمكنك تجنب أي تباطؤ في التشغيل المتداخل لـ COM.

المغلف يسمى "مؤسسة أدوات النشر"(DTF) وهنا الوصف الأساسي:"تعد Deployment Tools Foundation عبارة عن مجموعة غنية من مكتبات فئة .NET والموارد ذات الصلة التي تعمل معًا على جلب تقنيات النظام الأساسي لنشر Windows إلى عالم .NET.لقد تم تصميمه لتبسيط مهام التطوير المتعلقة بالنشر إلى حد كبير مع الاستمرار في الكشف عن الوظائف الكاملة للتكنولوجيا الأساسية".

فيما يلي عينة مجردة وعملية:

using (var db = new Database(FullPath, DatabaseOpenMode.ReadOnly))
{    
  PackageCode = db.SummaryInfo.RevisionNumber;
  AppVendor = db.SummaryInfo.Author;
  AppName = db.SummaryInfo.Title;
  ProductName = db.SummaryInfo.Subject;
  ProductCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductCode'");
  AppVersion = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 "`Property` WHERE `Property` = 'ProductVersion'");
  UpgradeCode = (string)db.ExecuteScalar("SELECT `Value` FROM "+
                 " `Property` WHERE `Property` = 'UpgradeCode'");
}

ملفات DTF الأساسية (الأخيران هما الأكثر استخدامًا):

  • Microsoft.Deployment.Compression.dll - إطار لتعبئة الأرشيف وتفريغه.
  • Microsoft.Deployment.Compression.Cab.dll - تنفيذ عملية تعبئة وتفريغ أرشيف الخزانة.
  • Microsoft.Deployment.Resources.dll - دروس لقراءة وكتابة بيانات الموارد في الملفات القابلة للتنفيذ.
  • Microsoft.Deployment.WindowsInstaller.dll - استكمال مكتبة الفئات المستندة إلى .NET لواجهات برمجة تطبيقات Windows Installer.
  • Microsoft.Deployment.WindowsInstaller.Package.dll - فئات موسعة للعمل مع تثبيت Windows Installer وحزم التصحيح.

ما عليك سوى إنشاء مشروع C#، والإشارة إلى هذه الملفات، وترميز تطبيق النشر الخاص بك بأي عنصر تحكم تريده وتحتاج إليه.لم أقم بإعداد أدوات DTF في الوقت الحالي، ولكن انظر هذه العينة للحصول على فكرة عامة عن كيفية عمل برنامج C#.

  • يتم تضمين DTF مع WIX. تحميل ويكس من هنا.
  • توجد ملفات DTF dlls في مجلد SDK في مجلد تثبيت WiX الرئيسي (الموقع الافتراضي هو:%ProgramFiles(x86)%\WiX Toolset v3.10\SDK).من المحتمل أن يكون رقم الإصدار مختلفًا عندما ترى ذلك.ما عليك سوى البحث عن مجلد WiX ضمن %ProgramFiles(x86)%.
  • بحث عن ملفات تعليمات DTF في مجلد "الوثيقة". DTF.chm و DTFAPI.chm.وثائق ممتازة للغاية لنموذج الكائن واستخدامه.
  • يرى هذا المنشور على serverfault.com لمزيد من التفاصيل DTF
  • بعض الاقتراحات المبدئية للعمل مع WiX: حزم MSI مقابل nuget:أيهما أفضل للتسليم المستمر؟

وفيما يلي مثال مشابه في VBScript التي يمكنني استخدامها كجزء من عملية الإنشاء بلدي في خلق التنفيذية الإطلاق ...

Option Explicit
Const MY_MSI = "product.msi"

Dim installer, database, view, result, sumInfo, sPackageCode

Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase (MY_MSI, 0)

Set sumInfo = installer.SummaryInformation(MY_MSI, 0)
sPackageCode =  sumInfo.Property(9) ' PID_REVNUMBER = 9, contains the package code.

WScript.Echo "ProductVersion=" & getproperty("ProductVersion")
WScript.Echo "ProductCode=" & getproperty("ProductCode") 
WScript.Echo "PackageCode=" & sPackageCode 
WScript.Echo "ProductName=" & getproperty("ProductName") 

Function getproperty(property)

    Set view = database.OpenView ("SELECT Value FROM Property WHERE Property='" & property & "'")
    view.Execute
    Set result = view.Fetch
    getproperty = result.StringData(1)

End Function 

ولقد وجدت الحل خفيفة الوزن غير المبرمج في lessmsi . يبدو أنه يستخدم WIX وعادل ينفجر في .MSI كله إلى المجلد المحدد. (كما أن لديها واجهة المستخدم لكنها لم تجعل عظيم بالنسبة لي على Win7 و).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top