Installer.OnCommitted コールバックでアプリケーションの ProductCode を知る必要があります。これを決定する明白な方法はないようです。
4 に答える
CustomActionData プロパティで /productCode=[ProductCode] を使用すると、製品コードのハードコーディングを回避できます。
最終的に、Visual Studio の CustomActionData プロパティを使用して、Installer クラスに製品コードをコマンド ライン引数として渡しました (例: /productcode={31E1145F-B833-47c6-8C80-A55F306B8A6C})。 Context.Parameters StringDictionary を使用するインストーラー クラス
string productCode = (string)Context.Parameters["productcode"];
MSI 関数 MsiGetProperty を使用して、ProductCode プロパティの名前を取得できます。私は .NET インストーラーを作成したことがないので、この場合にうまくいくかどうかはわかりません。
@Chris Tyburからの提案はうまくいくようです
ここに私のC#コードがあります:
public static string GetProductCode(string fileName)
{
IntPtr hInstall = IntPtr.Zero;
try
{
uint num = MsiOpenPackage(fileName, ref hInstall);
if ((ulong)num != 0)
{
throw new Exception("Cannot open database: " + num);
}
int pcchValueBuf = 255;
StringBuilder szValueBuf = new StringBuilder(pcchValueBuf);
num = MsiGetProperty(hInstall, "ProductCode", szValueBuf, ref pcchValueBuf);
if ((ulong)num != 0)
{
throw new Exception("Failed to Get Property ProductCode: " + num);
}
return szValueBuf.ToString();
}
finally
{
if (hInstall != IntPtr.Zero)
{
MsiCloseHandle(hInstall);
}
}
}
[DllImport("msi.dll", CharSet = CharSet.Unicode, EntryPoint = "MsiGetPropertyW", ExactSpelling = true, SetLastError = true)]
private static extern uint MsiGetProperty(IntPtr hInstall, string szName, [Out] StringBuilder szValueBuf, ref int pchValueBuf);
[DllImport("msi.dll", CharSet = CharSet.Unicode, EntryPoint = "MsiOpenPackageW", ExactSpelling = true, SetLastError = true)]
private static extern uint MsiOpenPackage(string szDatabasePath, ref IntPtr hProduct);
[DllImport("msi.dll", CharSet = CharSet.Unicode, ExactSpelling = true, SetLastError = true)]
private static extern int MsiCloseHandle(IntPtr hAny);
FWIW: この MSDN サイトには、懸念の原因となる可能性のある小さな宣伝文があります: https://docs.microsoft.com/en-us/windows/win32/msi/obtaining-context-information-for-deferred-execution-カスタムアクション
Function Description
MsiGetProperty Supports a limited set of properties when used with deferred execution custom actions:
the CustomActionData property, ProductCode property, and UserSID property.Commit custom
actions cannot use the MsiGetProperty function to obtain the ProductCode property.
Commit custom actions can use the CustomActionData property to obtain the product code.
コールアウトに注意してくださいcannot use the MsiGetProperty function to obtain the ProductCode property
。だからYMMV。
インストールされている MSI セットアップの製品GUIDを確認するにはどうすればよいですか? COM API を使用してこれを収集できます (現在のバージョンでは VBScript が表示されます)。これも調べる価値があります。