我正在使用事务性NTFS来读取和写入文件系统上的文件,我注意到应用程序遇到间歇性故障,这只能通过应用程序重启来解决。 错误的堆栈跟踪是:
System.Runtime.InteropServices.COMException (0xD0190052): Exception from HRESULT: 0xD0190052
at ...KtmTransactionHandle.IKernelTransaction.GetHandle(IntPtr& handle)
at ...KtmTransactionHandle.CreateKtmTransactionHandle(Transaction managedTransaction)
at ...KtmTransactionHandle.CreateKtmTransactionHandle()
at ...TransactedFile.Open(String path, FileMode mode, FileAccess access, FileShare share)
at ...TransactedFile.ReadAllText(String path)
IKernelTransaction是一个COM接口,我得到了一个句柄:
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("79427A2B-F895-40e0-BE79-B57DC82ED231")]
private interface IKernelTransaction
{
void GetHandle([Out] out IntPtr handle);
}
这里
IKernelTransaction tx = (IKernelTransaction)TransactionInterop.GetDtcTransaction(Transaction.Current);
我的代码与http://msdn.microsoft.com/en-us/library/cc303707.aspx
非常相似问题是我找不到此COM错误0xD0190052的任何信息。只知道这个错误代码是非常有用的。
由于
答案 0 :(得分:1)
纯粹的猜测
HRESULT 0xD0190052与STATUS_TRANSACTIONMANAGER_NOT_ONLINE非常相似,即0xC0190052 ...区别在于“N”-Bit,表示代码是否是所谓的NTSTATUS(参见http://msdn.microsoft.com/en-us/library/0642cb2f-2075-4469-918c-4441e69c548a%28PROT.10%29.aspx和http://msdn.microsoft.com/en-us/library/cc231200%28v=PROT.10%29.aspx和{ {3}})......
根据您的描述,您的应用程序似乎有时会失去与事务管理器的连接,或者事务管理器不稳定/重新启动或类似...
另外,对您的COM导入定义PreserveSig(true)
有助于获得一些HRESULT
说明...
希望这对你的情况有意义......
编辑:
我不确定您链接到的代码是否考虑了所有可能性......在方法TransactedFile.Open
中,调用scope.Complete();
这是好的和必要但是如果之前的某些代码use-block中的这个调用会抛出一些异常,根据http://msdn.microsoft.com/en-us/library/cc704588%28v=PROT.10%29.aspx