2011-02-02 45 views
3

我正在尝试在我的应用程序中找到一个错误;一个未处理的异常。看起来这个异常是独立于我的代码触发的地方。我能找到的唯一解释是,我使用的程序集执行一些触发异常的代码。程序集是否有初始化和/或终止程序?

那么程序集是否有初始化和/或终止例程或类似的东西?

+3

你有一个堆栈跟踪? – LukeH 2011-02-02 10:44:41

+0

组件何时终止? – 2011-02-02 10:53:07

+0

完整的消息我得到的是:“System.NullReferenceException:明镜Objektverweis wurde nicht奥夫EINE Objektinstanz festgelegt 贝Unify.SQLBase.Data.SQLBaseCommand.Dispose 贝Unify.SQLBase.Data.SQLBaseCommand.Finalize” – Luke 2011-02-02 10:55:05

回答

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的声音。很难相信他们会提供这样的bug。查找该提供程序的更新后,请仔细查看您在代码中创建的SqlCommand对象。如果这些都没有帮助,那么你确实需要供应商的支持(统一)。

0

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

你想确保一旦MQ已经被注册,你不要再试一次。你还要确保如果注册失败,你的构造函数不会抛出异常,而是设置类的状态,使得该类被创建但不可用。在构造函数中抛出异常将导致非常模糊的“类型初始化失败”错误消息。

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

1

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

3

您可以将处理程序添加到应用程序域:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; 

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

如果有异常被抛出这将现在被调用,并从那里你可以得到调用堆栈。如果您在调试器下运行它,请转到调试菜单 - >异常并勾选“引发”公共语言运行时异常。当抛出异常时,这将打破调试器。

1

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

但是,我怀疑你的异常是由模块初始化器中运行的代码引起的。它看起来像SQLBaseCommand.Dispose一样在Finalize时发生错误。因此,有几个问题:

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