2

我有一个在解决方案的另一个项目中使用 IDisposable 的 Web 应用程序(asp.net mvc 4)。这一切都可以从 Visual Studio (2012) 编译并运行良好,但是当使用浏览器运行 Web 应用程序(使用 IIS 8 Express)时会抛出异常。

我使用 IDisposable 的密封类在 using 语句中,并且在到达 using 大括号中的任何代码之前调用 Dispose() 方法,即

using (MySealedClass msc = new MySealedClass())
{
  //Code doesn't reach here. Dispose() is called beforehand
  //My code here . . . 
}

构造函数及其依赖项是:

private readonly IList<IntPtr> _intPtrList;

public MySealedClass()
{
    _intPtrList = new List<IntPtr>(); 
}

所以我认为那里不应该有任何问题。为了测试这一点,我在代码的前面实例化了 MySealedClass,而不使用 using 语句,如下所示:

MySealedClass msc = new MySealedClass()

代码可以通过这一点,然后我可以调用它的方法。

我在 MSDN 上看到了一些示例,其中 using 语句代码被编译器转换为 try catch 模式,但我认为这不能解释错误,因为错误发生在我的主块代码之前。

谁能解释 using 语句是否在做额外的事情?例如,它是否扫描代码块的其余部分,如果有它不喜欢的东西,则调用 Dispose() 方法。

我怀疑 IIS,之前,我有不安全的代码错误(尽管 web.config 中的配置正确),但我忘记让 IIS 以 x64 运行应用程序。使用 regedit 完成后,一切正常。

附加信息:在 using 块中,存在不安全代码和使用 [DllImport] 属性对外部 dll 的调用。

非常感谢

4

2 回答 2

2
using (MySealedClass msc = new MySealedClass())
{
  //Code doesn't reach here. Dispose() is called beforehand
  //My code here . . . 
}

由编译器翻译成与此非常相似的东西:

MySealedClass msc = null;
try
{
  msc = new MySealedClass();
  //My code here . . . 
}finally{
  if(msc != null){
    ((IDisposable)msc).Dispose():
  }
}

编译器不会事先检查您的代码,如果它看到它不喜欢的东西就会跳过它。

所以对我来说,似乎在你检查到你得到一个异常之前,它会导致它进入 finally 块并处理你的对象。

于 2013-09-20T10:56:02.227 回答
0

根据 MSDN 文档,“using 语句可确保调用 Dispose,即使在您调用对象上的方法时发生异常也是如此。”

你为什么不调试你在 using 块中提到的不安全代码。可能是外部 dll 中引发的异常导致调用 Displose() 方法?

于 2013-09-20T11:00:11.247 回答