C# 为什么IDisposable可以立即调用Dispose()?

C# 为什么IDisposable可以立即调用Dispose()?,c#,asp.net-mvc-4,iis,idisposable,C#,Asp.net Mvc 4,Iis,Idisposable,我有一个web应用程序(asp.net mvc 4),它在解决方案的另一个项目中使用IDisposable。从VisualStudio(2012)开始,它可以正常编译和运行,但当使用浏览器运行web应用程序(使用IIS 8 Express)时,会引发异常 使用IDisposable的密封类位于using语句中,在到达using大括号中的任何代码之前调用Dispose()方法 using (MySealedClass msc = new MySealedClass()) { //Code do

我有一个web应用程序(asp.net mvc 4),它在解决方案的另一个项目中使用IDisposable。从VisualStudio(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>(); 
}
代码可以通过这一点,然后我可以调用它的方法

我在MSDN上看到过一些例子,其中使用语句代码被编译器翻译成try-catch模式,但我认为这并不能解释错误,因为错误发生在我的主块代码之前

有人能解释一下using语句是否做了额外的事情吗?e、 g.是否扫描代码块的其余部分,如果有不喜欢的内容,则调用Dispose()方法。

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

其他信息:在using块中,存在不安全代码,并使用[DllImport]属性调用外部DLL

非常感谢

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块并处理您的对象。

根据MSDN文档,“using语句确保即使在调用对象的方法时发生异常,也会调用dispose。”


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

您如何确定发生了什么-是什么让您相信正在立即调用
Dispose()
,并且控件从未进入
using
块的内部?代码必须进入using块。您必须引发异常。因为它仅在浏览器中不起作用,所以我在using语句行下面的第一行抛出异常,但它没有到达。谢谢,但这不会导致与仅MySealedClass msc=new MySealedClass()相同的错误吗?(不使用语句)是的,tt应该。构造函数是否只有上面提到的一行代码?问题是,除了构造函数之外,其他初始化器也将运行到。因此,您所拥有的任何东西,如
public SomeClass VarName=new SomeThing()
。我最好的猜测是,您使用DllImport设置的东西崩溃并导致异常。它在没有using块的IIS中工作吗,或者您在另一个环境中没有using块的情况下尝试过它吗?如果这让您知道了什么,我想我们需要查看
MySealedClass
中的整个代码才能找到您的问题。构造函数只是一行,没有其他初始化器。我现在将在IIS上尝试它,而不使用using块。当你说“不同的环境”时,你指的是其他IIS吗?不幸的是,所有IIS在visual studio中都运行良好,所以调试没有帮助。我求助于在不同的地方抛出异常,从浏览器重建和调用异常。
MySealedClass msc = null;
try
{
  msc = new MySealedClass();
  //My code here . . . 
}finally{
  if(msc != null){
    ((IDisposable)msc).Dispose():
  }
}