MsiInstallProduct在窗口2016上抛出NullReferenceException

时间:2018-11-28 11:07:31

标签: .net windows windows-installer pinvoke

我遇到奇怪的错误:

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

1 个答案:

答案 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,其中包含运行自定义操作所需的文件。


一些其他链接