我正在尝试在我的应用程序中找到一个错误;一个未处理的异常。看起来这个异常是独立于我的代码触发的地方。我能找到的唯一解释是,我使用的程序集执行一些触发异常的代码。程序集是否有初始化和/或终止程序?
那么程序集是否有初始化和/或终止例程或类似的东西?
我正在尝试在我的应用程序中找到一个错误;一个未处理的异常。看起来这个异常是独立于我的代码触发的地方。我能找到的唯一解释是,我使用的程序集执行一些触发异常的代码。程序集是否有初始化和/或终止程序?
那么程序集是否有初始化和/或终止例程或类似的东西?
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对象。如果这些都没有帮助,那么你确实需要供应商的支持(统一)。
只要将适当的safegaurds放在适当的位置,就可以在类构造函数(或静态构造函数)中执行此操作。
你想确保一旦MQ已经被注册,你不要再试一次。你还要确保如果注册失败,你的构造函数不会抛出异常,而是设置类的状态,使得该类被创建但不可用。在构造函数中抛出异常将导致非常模糊的“类型初始化失败”错误消息。
更好的方法是创建一个管理与MQ的关系的单例类。单例在您的类构造函数中实例化一次。它需要提供一个明确的“注册”方法,任何其他访问MQ的方法都将成为这个单例的一部分,并且可以隐式地利用寄存器方法。这样做的好处是每次调用MQ时,系统都会验证MQ是否已注册,并且在进行调用之前是否注册。
没有,.NET程序集没有初始化或终止例程
您可以将处理程序添加到应用程序域:
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
throw new NotImplementedException();
}
如果有异常被抛出这将现在被调用,并从那里你可以得到调用堆栈。如果您在调试器下运行它,请转到调试菜单 - >异常并勾选“引发”公共语言运行时异常。当抛出异常时,这将打破调试器。
C#不支持模块初始值设定项是正确的,尽管CLB v2支持它们为。这将需要修改IL来创建一个。见http://blogs.msdn.com/b/junfeng/archive/2005/11/19/494914.aspx。
但是,我怀疑你的异常是由模块初始化器中运行的代码引起的。它看起来像SQLBaseCommand.Dispose一样在Finalize时发生错误。因此,有几个问题:
你有一个堆栈跟踪? – LukeH 2011-02-02 10:44:41
组件何时终止? – 2011-02-02 10:53:07
完整的消息我得到的是:“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