程序集是否有初始化和/或终止例程?

时间:2011-02-02 10:42:16

标签: c# .net debugging

我正在尝试在我的应用程序中找到一个错误;一个未处理的例外。似乎异常是在我触发的代码中独立的地方。我能找到的唯一解释是,我使用的程序集执行一些触发异常的代码。

组件是否有初始化和/或终止例程或类似的东西?

5 个答案:

答案 0 :(得分:3)

您可以向appdomain添加处理程序:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;

void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    throw new NotImplementedException();
}

如果抛出任何异常,现在将调用此函数,从那里可以获得调用堆栈。如果您在调试器下运行它,请转到Debug菜单 - >公共语言运行时异常的异常和勾选“抛出”。这会在抛出异常时中断调试器。

答案 1 :(得分:2)

System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
  bei Unify.SQLBase.Data.SQLBaseCommand.Dispose
  bei Unify.SQLBase.Data.SQLBaseCommand.Finalize

是的,这是一个非常讨厌的例外。它由SQLBaseCommand类的终结器引发。当终结器线程运行时会发生这种情况。这与您的代码完全异步,它可以在任何时间点发生。 CLR将立即终止您的计划。

这是您正在使用的数据库提供程序中的一个令人讨厌的错误,SQLBase的声音。很难相信他们会向提供商提供类似的错误。在寻找该提供程序的更新时,请仔细查看您在代码中创建的SqlCommand对象。如果这些都没有帮助那么你真的需要供应商的支持(统一)。

答案 2 :(得分:1)

不,.NET程序集没有初始化或终止例程

答案 3 :(得分:1)

C#不支持模块初始值设定项是正确的,尽管CLR v2中 支持。它需要修改IL来创建一个。请参阅http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx

但是,我怀疑您的异常是由模块初始化程序中运行的代码引起的。看起来错误发生在Finalize上的SQLBaseCommand.Dispose中。所以,有几个问题:

  1. 您是否处置了所有实现IDisposable的SQLBaseCommand和相关对象?如果没有,那么SQLBaseCommand类可能没有正确地实现终结,你可以通过自己处理它来避免这种情况(无论如何这是最好的做法)。
  2. 查看您的SQLBaseCommand对象的数量和用法。它们是否根据API形成良好?你是否以正确的模式使用它们?
  3. 获取Red Gate的Reflector(http://www.red-gate.com/products/dotnet-development/reflector/)等工具,以查看反编译的SQLBaseCommand C#代码。查看Finalize和Dispose方法。你可以忽略初始化或以任何方式受到影响的期望是什么?

答案 4 :(得分:0)

只要您放置了适当的safegaurds,就可以在类构造函数(或静态构造函数)中执行此操作。

您希望确保一旦注册了MQ,就不要再尝试这样做了。您还需要确保如果注册失败,您的构造函数不会抛出异常,而是以创建类但不可用的方式设置类状态。在构造函数中抛出异常将导致非常模糊的“类型初始化失败”错误消息。

更好的方法是创建一个管理与MQ关系的单例类。单例在类构造函数中实例化一次。它需要提供一个显式的“寄存器”方法,并且访问MQ的任何其他方法都是该单例的一部分,并且可以隐式地利用寄存器方法。这样做的好处是,每次调用MQ时,系统都会验证MQ是否已注册,如果没有注册,则在进行调用之前。