8

チュートリアルGet version from MSI without installed it からこのコードを使用しようとしていますが、「msi.dll」を参照として Visual Studio 2010 に追加しようとすると、このエラーが発生します。

ファイルまたはアセンブリ 'msi.dll' またはその依存関係の 1 つを読み込めませんでした。モジュールには、アセンブリ マニフェストが含まれている必要がありました。

このファイルはマネージド アセンブリではない可能性があります

4

4 に答える 4

20

Wix プロジェクトの Deployment Tools Foundation (DTF) から「Microsoft.Deployment.WindowsInstaller.dll」を使用します。DTF は、多くの msi.dll に対してマネージ ラッパーを提供します。Wix は役立つドキュメントも提供しています。

ここで DTF を使用すると、C# で msi のバージョン番号にアクセスする方法が示されます

using Microsoft.Deployment.WindowsInstaller;

namespace Msi.Tables
{
    public class PropertyTable
    {
        public static string Get(string msi, string name)
        {
            using (Database db = new Database(msi))
            {
                return db.ExecuteScalar("SELECT `Value` FROM `Property` WHERE `Property` = '{0}'", name) as string;
            }
        }
        public static void Set(string msi, string name, string value)
        {
            using (Database db = new Database(msi, DatabaseOpenMode.Direct))
            {
                db.Execute("UPDATE `Property` SET `Value` = '{0}' WHERE `Property` = '{1}'", value, name);
            }
        }
    }
}

それから私のアプリケーションから

string msiVersion = PropertyTable.Get("MyInstall.msi", "ProductVersion");

Orca を使用して msi テーブルを表示できます。MSDN では、プロパティ テーブルに関するドキュメントを提供しています。Windows インストーラーの SQL 構文の詳細は、MSDN でも入手できます。

于 2012-04-19T18:25:41.727 に答える
3

ここに画像の説明を入力

32 ビット マシンでアセンブリを登録するには

REGSVR32 MSI.DLL

64 ビット マシンでアセンブリを登録するには

cd \windows\syswow64 regsvr32 C:\WINDOWS\system32\msi.dll 
于 2012-04-19T17:34:48.020 に答える
1

コードプロジェクトから:

バージョン番号またはその他の製品関連のものにアクセスするには、Visual Studio .NET に DLL 参照が必要です。DLL 名: msi.dll (system32 に存在)。

ソリューション エクスプローラーでプロジェクトへの参照を追加する必要があると思います (SE の [参照] を右クリック -> [参照の追加] -> [system32] ディレクトリの msi.dll を参照します)。

于 2012-04-19T17:31:04.413 に答える
0

参照に追加system.managementし、名前空間を含めます。

var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Product where Name LIKE '%Your MSI Name%'");

foreach (ManagementObject obj in searcher.Get())
{
  var version = obj["Version"];                
}

これにより、コントロール パネルにインストールされているソフトウェアのバージョンがわかります。

于 2013-12-25T16:22:54.770 に答える