MsiOpenDatabase不会打开MSI文件(错误代码110)

时间:2016-09-23 16:34:49

标签: c# .net wix windows-installer

我在这里有一个奇怪的效果。 我正在尝试使用DTF程序集打开现有的MSI文件,它返回错误代码110(ERROR_OPEN_FAILED)。如果我试图通过MsiGetLastErrorRecord获取最后一个错误 - 它返回0,即没有错误。

对于实验,我试图直接使用WinAPI打开同一个文件(来自C ++应用程序),它运行正常。

据我所知,很多人都使用DTF,我认为它没有错误,所以它应该是我的系统/配置的一些问题。

我正在使用Windows 10和VS2012与.NET 4.5

任何提示,它可能是什么?

PS:实际上,从一开始我就试图自己互操作WinAPI而且我得到了这个结果。使用DTF试图阐明我最终错误的互操作。

更新:我已经使用ProcessMonitor检查了执行情况,并看到CreateFile因共享违规而失败: 期望的访问:通用读/写 性格:开放 选项:同步IO非警报,非目录文件 属性:N ShareMode:阅读 AllocationSize:不适用

更新2:这是最令人厌恶的错误之一。问题是因为已经打开数据库的属性是从设计模式触发的。 现在问题解决了。谢谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

来自DTF帮助文件

using (Database db = new Database("product.msi", DatabaseOpenMode.ReadOnly))
    {        string value = (string) db.ExecuteScalar(
        "SELECT `Value` FROM `Property` WHERE `Property` = '{0}'", propName);
    }

这显然应该在只读模式中工作,无论文件是否锁定在其他地方。还有方便的 InstallPackage类,可以在压缩或未压缩的产品布局环境中使用文件和文件柜:

using (InstallPackage pkg = new InstallPackage("d:\builds\product.msi",
DatabaseOpenMode.Transact))     
{
   //(find the rest of the sample in the DTF help file)
}

我会尝试使用不同的 DatabaseOpenModes ReadOnly Transact Direct 创建 CreateDirect )。