2013-05-31 34 views
10

シングルトンクラスThreadQueue<T>を使用するWindowsサービスがあります。サービスが開始されると、ThreadQueue<string>.Start()への呼び出しが行われ、このクラスは並行性を構成可能なスレッド数に制限するタスクを受け入れてキューに入れます。Strange System .__ Canon例外

ThreadQueue<string>.Start()は、サービスの起動時に一度だけ呼び出されます。

機会に

、後、私は次の例外受け取る実行されているサービスの数時間:

Application: myservice.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.NullReferenceException 
Stack: 
    at Apollo.Business.Framework.Threading.ThreadQueue.ThreadQueue`1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].Start() 
    at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
    at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ThreadHelper.ThreadStart() 

System.__Canon何であるとどのようなタイプの引数としてこの中に渡し、このコールを作っているの?

誰でも光を放つことはできますか?

+1

'Debug 'モードでコンパイルしようとしましたか? – Ofiris

+0

それはすでに、なぜあなたはそれを聞いていますか? – jaywayco

答えて

17

ではありません。は、メソッド引数型名の中の何かを読み込みます。 System .__ Canonは、CLRでジェネリックが実装される方法に関する実装の詳細です。正確な使用法はわかりませんが、.NETの最適化ツールであるNgen.exe(プリジェットアセンブリ)によって使用されていると強く疑われます。ジェネリックスは、実行時に具体的な型がインスタンス化されるため、事前ジッチングの問題です。型パラメーターの引数型を取るメソッドの複数のコピーを取得します。ただ任意の参照型を扱うメソッド、各値タイプの追加メソッド(存在する場合)。 System .__キヤノンは、参照型のプレースホルダーである代替型にすることができ、Ngen.exeは実際の型が実行時にどのように使用されるかを推測できなくても、そのメソッドを事前設定することができます。そんな感じ。

靴が合う、Apollo.Business.Framework.Threading.ThreadQueueは、複数のプログラムで使用されていたためにインストールされたときにプリインストールされるフレームワークスタイルライブラリにあるクラスのようなものです。

したがって、実際の例外に焦点を当てて型名を無視してください。 NullReferenceExceptionは、非常にの例外です。そうでなければスタックトレースから何も表示されず、スタックトレースの原因を突き止めるものはありません。私はその "Apollo"フレームワークの初期化問題で、値を持つべきであるがまだヌルであるオブジェクトを推測します。 ThreadQueueコンストラクタのソースコードを調べると、ヒントが得られるはずです。あなたがそれを持っていない場合、ベンダーに助けを求める呼び出し。ジッタの8年前のバージョンのバグではそれをうまく説明することはできません。そのバグはずっと前に修正されています。

7

ランタイムとフレームワークがオープンソースであったので、このタイプの質問にはるかに簡単に答えることができます。 __Canonの定義はhereです。引用:

// Internal methodtable used to instantiate the "canonical" methodtable for generic instantiations. 
// The name "__Canon" will never been seen by users but it will appear a lot in debugger stack traces 
// involving generics so it is kept deliberately short as to avoid being a nuisance. 

[Serializable] 
[ClassInterface(ClassInterfaceType.AutoDual)] 
[System.Runtime.InteropServices.ComVisible(true)] 
internal class __Canon 
{ 
} 

コメントで説明しているように、これはジェネリックの実装の詳細であり、 "canonical"の略語です。