【问题标题】:MsiInstallProduct throw NullReferenceException on window 2016MsiInstallProduct 在窗口 2016 上抛出 NullReferenceException
【发布时间】:2018-11-28 11:07:31
【问题描述】:

我收到奇怪的错误:

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

【问题讨论】:

  • 应该先阅读最后一行 - 请记住,以下建议也适用于找到 Q/A 的其他人,以防您发现它们无关紧要。 MSI 日志事件查看器 说什么?它在其他服务器上工作吗?组策略设置?它是什么类型的 MSI 文件?您尝试安装的文件在哪里?可以从该服务器访问它吗?您是否尝试在服务器上手动安装?你测试了多少台机器?

标签: .net windows windows-installer pinvoke


【解决方案1】:

更新(针对社区):如果您坚持直接进行平台调用,您仍然可以从下面提到的 DTF 中受益,因为the DTF source code is available on github.com。你可以看到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,其中包含运行自定义操作所需的文件。


更多链接

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2014-03-26
  • 2020-11-17
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多