我在这里有一个奇怪的效果。我试图使用DTF程序集打开现有的msi文件,它返回错误代码110 (ERROR_OPEN_FAILED)。如果我试图通过MsiGetLastErrorRecord获得最后一个错误-它返回0,即没有错误。
作为实验,我尝试使用WinAPI直接打开相同的文件(从c++应用程序),它工作得很好。
据我所知,DTF被很多人使用,我想它没有错误,所以它应该是我的系统/配置的一些问题。
我正在使用Windows 10和VS2012与。net 4.5
有什么提示吗?
PS:实际上,从一开始我就试图自己互操作WinAPI,我得到了这个结果。使用DTF是为了说明我最终错误的互选。
Update:我已经检查了ProcessMonitor的执行,并且已经看到CreateFile在共享违规时失败了:期望访问:通用读/写性格:开放选项:同步IO非警报、非目录文件属性:NShareMode:阅读AllocationSize: n/a
更新2:这是最愚蠢的错误之一。问题是由于从设计模式触发了打开DB的属性。现在问题解决了。谢谢大家的帮助!
从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:buildsproduct.msi",
DatabaseOpenMode.Transact))
{
//(find the rest of the sample in the DTF help file)
}
我会尝试这两个类与不同的DatabaseOpenModes (ReadOnly, transaction , Direct, Create, CreateDirect)。