如何在c#中读取MSI属性

Dev*_* B. 9 c# windows-installer

我想在桌面应用程序中读取C#中的MSI属性.我使用以下代码:

    public static string GetMSIProperty( string msiFile, string msiProperty)
    {
        string retVal= string.Empty ;

        Type classType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
        Object installerObj = Activator.CreateInstance(classType);
        WindowsInstaller.Installer installer = installerObj as WindowsInstaller.Installer;

        Database database = installer.OpenDatabase("C:\\DataP\\sqlncli.msi",0 );   

        string sql = String.Format("SELECT Value FROM Property WHERE Property=’{0}’", msiProperty);

        View view = database.OpenView(sql);

        Record record = view.Fetch();

        if (record != null)
        {
            retVal = record.get_StringData(1);
        }
        else
            retVal = "Property Not Found";

        return retVal;            
    }
Run Code Online (Sandbox Code Playgroud)

但是我收到错误,因为System.Runtime.InteropServices.COMException未处理.

sqlncli.msi文件实际放置在c:\ DataP位置.在调试时我发现数据库不包含installer.OpenDatabase()语句之后的数据.

请建议我如何解决此问题并在c#中获取MSI属性.

提前致谢.

Chr*_*ter 17

Windows Installer XML的部署工具基础(WiX DTF)是Microsoft的一个开源项目,包括Microsoft.Deployment.WindowsInstaller MSI互操作库.使用它来执行这些类型的查询要容易得多,也更可靠.它甚至还有一个LINQ to MSI提供程序,它允许您将MSI表视为实体并针对它们编写查询.

using System;
using System.Linq;
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Deployment.WindowsInstaller.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            using(var database = new QDatabase(@"C:\tfs\iswix.msi", DatabaseOpenMode.ReadOnly))
            {
                var properties = from p in database.Properties
                                 select p;

                foreach (var property in properties)
                {
                    Console.WriteLine("{0} = {1}", property.Property, property.Value);
                }
            }

            using (var database = new Database(@"C:\tfs\iswix.msi", DatabaseOpenMode.ReadOnly))
            {
                using(var view = database.OpenView(database.Tables["Property"].SqlSelectString))
                {
                    view.Execute();
                    foreach (var rec in view) using (rec)
                    {
                        Console.WriteLine("{0} = {1}", rec.GetString("Property"), rec.GetString("Value"));
                    }
                }
            }

            Console.Read();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Cip*_*ian 1

SQL 字符串不正确。它应该是:

\n\n
SELECT `Value` FROM `Property` WHERE `Property`.`Property` = \xe2\x80\x99{0}\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n