我在这里有一个奇怪的效果。 我正在尝试使用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:这是最令人厌恶的错误之一。问题是因为已经打开数据库的属性是从设计模式触发的。 现在问题解决了。谢谢大家的帮助!
答案 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 )。