4

コアビジネスロジックと機能を実行する、自分で作成したサービスがあります。このサービスは、1つのプロジェクトのサービスラッパーおよびWindowsライブラリプロジェクトのすべての機能として設計されています。また、Windowsライブラリプロジェクトをラップするコンソールアプリケーションもあります。

実稼働前の環境では、これは問題なく機能します。サービスが開始され、すべてが順調に進んでいます。

私たちの本番環境では、サービスを開始できません。

Application: URTWorkerService.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.FileNotFoundException
Stack:
   at URTWorker.Worker.Run()
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   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()

これは変だと思い、次のようにDebug.WriteLine()呼び出しを追加しました。

/// <summary>
/// Entry point method into the Worker class
/// </summary>
public void Run()
{
    Debug.WriteLine("Did we make it this far?");
    var exitEventArgs = ExitEventArgs.Clear;
    try
    {
        BroadcastEcho("Worker::Run::Enter", TraceLevel.Verbose);
        WorkerStartedOn = DateTime.Now;
        State = AsyncState.Running;

        BroadcastEcho("Worker::Run::Pre initialize", TraceLevel.Verbose);
        Initialize();
        BroadcastEcho("Worker::Run::Post initialize", TraceLevel.Verbose);

        ExecuteWorkerLoop();
    }
    catch (Exception ex)
    {
        exitEventArgs.Reason = ExitReason.Exception;
        var vars = new Dictionary<string, string>();

        StandardMessage message;

        // TODO Comment about this
        if (ex is FormatException && ex.Message.Contains("FieldNames.cs"))
        {
            BroadcastEcho("The field definition has changed. Generating new code file.", ex);
            var path = CreateConstantsCodeFile();
            BroadcastEcho("The file has been saved to " + path, TraceLevel.Error);
            vars.Add("FieldsNamesPath", path);
            message = StandardMessage.NewFieldsNameFile;
        }
        else
        {
            BroadcastEcho("An unhandled exception was thrown", ex);
            vars.Add("ExtraInfo", "<b>This is a crashing exception.</b>");
            message = StandardMessage.UnhandledError;
        }
        Notifier.SendErrorMail(message, vars, ex);

    }

    var lastCount = -1;
    while (Notifier.MailInTransit.Count > 0)
    {
        if (lastCount != Notifier.MailInTransit.Count)
        {
            var suffix = (
                lastCount != 1
                    ? "s"
                    : string.Empty);

            lastCount = Notifier.MailInTransit.Count;
            BroadcastEcho(string.Format("Waiting for {0} mail item{1} to finish sending", lastCount, suffix), TraceLevel.Info);
        }

        Thread.Sleep(0);
    }

    State = AsyncState.Stopped;
    BroadcastEcho("Worker::Run::Exit", TraceLevel.Verbose);
    Exit(exitEventArgs);
}

これがDbgViewキャプチャです...

[11864] Program::Main 
[11864] Verbose::WorkerService::Enter  
[11864] Verbose::WorkerService::Exit  
[11864] Info::Starting Worker Service  
[11864] Verbose::OnStart::Enter  
[11864] Verbose::OnStart::Worker Service received Start command  
[11864] Verbose::OnStart::Current directory = C:\Windows\system32  
[11864] Verbose::OnStart::try::Created workerThread  
[11864] Verbose::OnStart::try::workerThread started  
[11864] Verbose::OnStart::try::Done waiting  
[11864] Verbose::OnStart::Exit  

BroadcastEcho()TraceLevel値に記載されているようにすべてのメッセージを表示できますが、表示されることはありDebug.WriteLine()ません。

それから、アセンブリバインディングの問題かもしれないと思いました。FusionLogの結果は次のとおりです。

*** Assembly Binder Log Entry  (1/24/2013 @ 7:47:52 AM) ***

The operation was successful.
Bind result: hr = 0x0. The operation completed successfully.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\RTWorker\URTWorkerService.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = REDMOND\msrrtsa
LOG: DisplayName = URTWorker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
 (Fully-specified)
LOG: Appbase = file:///C:/RTWorker/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = URTWorkerService.exe
Calling assembly : URTWorkerService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\RTWorker\URTWorkerService.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/RTWorker/URTWorker.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\RTWorker\URTWorker.dll
LOG: Entering run-from-source setup phase.
LOG: Assembly Name is: URTWorker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
LOG: Binding succeeds. Returns assembly from C:\RTWorker\URTWorker.dll.
LOG: Assembly is loaded in default load context.

どちらのマシンもWindowsServer2008R2SP1です。プリプロダクションは仮想マシンであり、プロダクションは物理マシンです。

それが何であるかについての提案はありますか?

4

3 に答える 3

3

問題が見つかりました。

まず、に適用されるログだけでなく、すべての Fusion ログを確認する必要がありますURTWorker.dll

*** Assembly Binder Log Entry  (1/24/2013 @ 8:53:57 AM) ***

The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.

Assembly manager loaded from:  C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable  C:\RTWorker\URTWorkerService.exe
--- A detailed error log follows. 

=== Pre-bind state information ===
LOG: User = REDMOND\msrrtsa
LOG: DisplayName = Microsoft.TeamFoundation.WorkItemTracking.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
 (Fully-specified)
LOG: Appbase = file:///C:/RTWorker/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = URTWorkerService.exe
Calling assembly : URTWorker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\RTWorker\URTWorkerService.exe.Config
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Microsoft.TeamFoundation.WorkItemTracking.Client, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/RTWorker/Microsoft.TeamFoundation.WorkItemTracking.Client.DLL.
LOG: Attempting download of new URL file:///C:/RTWorker/Microsoft.TeamFoundation.WorkItemTracking.Client/Microsoft.TeamFoundation.WorkItemTracking.Client.DLL.
LOG: Attempting download of new URL file:///C:/RTWorker/Microsoft.TeamFoundation.WorkItemTracking.Client.EXE.
LOG: Attempting download of new URL file:///C:/RTWorker/Microsoft.TeamFoundation.WorkItemTracking.Client/Microsoft.TeamFoundation.WorkItemTracking.Client.EXE.
LOG: All probing URLs attempted and failed.

失敗したバインディングは、Team Foundation クライアント ライブラリがインストールされておらず、参照を設定してもすべてが取得されないため、それらが見つからないことを示していCopyLocal = trueます。

これにより、より良い方向に進むことができます。

.Net にもっと優れた例外メソッド (「FileNoteFound: アセンブリ XXX を読み込めません。」) があれば、それは素晴らしいことです。

于 2013-01-24T17:15:01.707 に答える
0

暗闇で撮影し、明示的に Flush() を強制するか、Debug.AutoFlush = true に設定しますか?

于 2013-01-24T16:51:25.430 に答える