【问题标题】:.NET isolated storage file locking throws NRE.NET 隔离存储文件锁定引发 NRE
【发布时间】:2010-03-04 22:19:27
【问题描述】:

所以我试图在我的 C# 客户端应用程序中锁定一个隔离的存储文件,以便我的应用程序的多个副本无法同时访问它。我正在使用以下语法:

lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
lockStream.Lock(0, 0);

此代码导致我的应用程序从框架的 FileStream.Lock 方法中抛出 NullReferenceException。我尝试使用非零值作为长度。我尝试将一个字节写入文件,然后仅锁定该字节。无论我做什么,同样的 NullReferenceException 一直困扰着我。有谁知道隔离存储是否可以做到这一点?

我也在研究在 Silverlight 应用程序中使用这种技术,Silverlight 是否支持文件锁定? MSDN 文档似乎表明它没有,但我从 C# MVP 中看到this post 说它有。

更新:微软已经修复了我在 Connect 上提交的错误,但它并未在框架的第 4 版中发布。它应该有望在下一个 SP 或完整版本中提供。

【问题讨论】:

  • 我能够通过使用反射来解决此错误,以在 IsolatedStorageFileStream 的私有 'm_fs' 字段上调用 ​​Lock 方法,如下所示:lockStream = new IsolatedStorageFileStream("q.lck", FileMode.OpenOrCreate,等存储); FileStream m_fs = typeof(IsolatedStorageFileStream).InvokeMember(("m_fs"), BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance, null, lockStream, null) as FileStream; m_fs.Lock(0, long.MaxValue);

标签: c# .net silverlight isolatedstorage filelock


【解决方案1】:

这看起来像是框架中的一个错误。我可能是错的,因为它真的太大了,不真实。

查看带有Reflector的.NET 3.5 SP1的源码,发现IsolatedStorageFileStream调用了无参数的基类构造函数(FileStream()),导致基类没有真正初始化。 IsolatedStorageFileStream 创建 FileStream 的一个实例,并在它覆盖的所有方法(Write、Read、Flush、Seek 等)中使用它。奇怪的是它没有直接利用它的基类。

但是 Lock 和 Unlock 没有被覆盖,它们需要一个仍然为 null 的私有字段 (_handle)(因为使用的构造函数是无参数的)。他们假设它是非空的并取消引用它并导致 NRE。

总而言之,不支持锁定和解锁(或有问题)。

我猜你不得不使用其他锁定方法,例如 Mutex 或 Semaphore。

在 .NET 4 RC 中的实现是相同的。在 Silverlight 中,Lock an Unlock 根本不存在(我很抱歉与 MVP 相矛盾)。

【讨论】:

【解决方案2】:

尝试为要锁定的数据量设置一个大于 0 的值。另外,流中是否有任何数据,如果没有要锁定的内容可能是问题....

 lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore);
 lockStream.Write(.....)
 lockStream.Lock(0, 10);

【讨论】:

  • 我还尝试了以下方法:lockStream = new IsolatedStorageFileStream("my.lck", FileMode.OpenOrCreate, isoStore); lockStream.WriteByte(0xFF); lockStream.Lock(0, 1);这以完全相同的方式失败了。
  • 我只是在做一个基本的IsolatedStorageFile isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多