我遇到奇怪的错误:
ERROR:System.NullReferenceException: Object reference not set to an instance of an object.
at WindowsInstaller.MsiInterop.MsiInstallProduct(String product, String commandLine)
at msicontroller.Program.Main(String[] arg
声明:
[DllImport(MSI_LIB, CharSet = CharSet.Auto, SetLastError=true)]
extern static public MsiError MsiInstallProduct(string product, string commandLine);
我仅在1台电脑上遇到此错误,电脑是Win Server 2016
答案 0 :(得分:1)
UPDATE (对于社区):如果您坚持要直接进行平台调用,那么自the DTF source code is available on github.com起,您仍然可以从下面提到的DTF中受益。您可以看到platform invokes / COM互操作方式 在这里完成。
DTF :使用DTF (Deployment Tools Foundation)会更容易。这是WiX toolkit一部分的一个组件/一组程序集,它为您处理了所有平台调用,因此您可以将 MSI API 用作常规托管API(左右)。换句话说,是 DTF is essentially a .NET wrapper for the Win32 Windows Installer API
。
DTF示例 (from this answer, section 6):
using Microsoft.Deployment.WindowsInstaller;
public static void Uninstall( string productCode)
{
Installer.ConfigureProduct(productCode, 0, InstallState.Absent, "REBOOT=\"R\"");
}
过程 :下载WiX工具集,在Visual Studio项目中安装引用并将其添加到Microsoft.Deployment.WindowsInstaller.dll
文件中,并将其与其他版本一起部署文件。或者,如果这是针对Windows Installer自定义操作的,则:包装在您的自定义操作项目中。安装Visual Studio集成后,WiX中的模板即可用于此目的-从上面的同一链接中单独下载。从本质上讲,它应该在构建时自动神奇地发生。解决的方法是将托管DLL(程序集)在构建过程中转换为本地包装DLL,其中包含运行自定义操作所需的文件。
一些其他链接 :