none
Debugモードでブレイクポイントを設定した場合としない場合で動作が違う RRS feed

  • 質問

  • いつもお世話になっております。
    先日、「C#にてWORDファイル作成時に任意のFONTを1行目から設定する方法について」というタイトルで質問させて頂き、回答者様からご回答を頂いた者です。
    ご回答いただいた際には解決できたと思っていたのですが、以下のような問題が発生し、何故そうなってしまうのか全く判断できず難儀しております。
    下記現象の解決方法をご教授頂けると幸いです。

    [発生現象]
    ブレイクポイントをFONT設定の処理に設定し、一度停止させてから設定処理を実行した際には、指定したFONT及びFONTサイズで作成中のWORDファイルに反映されるのですが、ブレイクポイントを設定せずに処理を実行すると、作成されたWORDファイルにFONTは設定されず、FONTサイズのみ設定される状態となります。
    ※上記現象はPC起動後初めてのVisual Studio2015を起動し、プロジェクトからアプリを実行した際には発生しません。
     また、上記現象はインストーラ(Publish)でインストールしたアプリを実行した際に発生していたのですが、その後調査を進めている中でDebug・Releaseそれぞれのモードでも発生するようになりました。

    [開発環境]
    OS:Windows7
    開発言語:C#
    開発環境:Visual Studio 2015

    2017年10月24日 14:52

回答

  • 本件、一応の解決を見ましたので、ご報告いたします。

    ただ、何故そうすることにより現象が発生しなくなるかが

    判明していないため、確実な保証のある解決方法ではありません。

    【解決のための実施内容】

    FONTの種類を設定した直後に、100msのスリープ処理を実施する。

    2017年11月1日 15:18

すべての返信

  • よくわかりませんが、一度、Selectメソッドを実行してみてはいかがでしょうか?

    Range.Select メソッド
    https://msdn.microsoft.com/ja-jp/VBA/Word-VBA/articles/range-select-method-word


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年10月26日 2:13
    モデレータ
  • どういうデバッグの操作なんでしょうね.. 単に止めているだけかな。 

    『C#にてWORDファイル作成時に任意のFONTを1行目から設定する方法について』を見ていて気になった箇所は、
    p.Range.Font.Name = "MS 明朝";
    という部分で、
    p.Range.Font.Name = "MS 明朝";
    こちらのほうが正しいので変更してください。(行の長さが少し違いますでしょう?)

    2017年10月26日 11:55
  • 返信が遅くなり申し訳ありません。

    Selectメソッドを事項しても変わりませんでした。

    2017年11月1日 15:09
  • 返信が遅くなり申し訳ありません。

    また、ご指摘ありがとうございます。

    ブレイクポイントは、一旦停止させているだけで、なにもデータの変更など行っていません。

    2017年11月1日 15:13
  • 本件、一応の解決を見ましたので、ご報告いたします。

    ただ、何故そうすることにより現象が発生しなくなるかが

    判明していないため、確実な保証のある解決方法ではありません。

    【解決のための実施内容】

    FONTの種類を設定した直後に、100msのスリープ処理を実施する。

    2017年11月1日 15:18
  • こっちの問題かもしれません。

    現在どういうコードになっているのか分かりませんが、
    https://japan-paradise.com/reports/ms-office-interop/release-com-object.aspx
    によると、
    『タスクマネージャを開いてみましょう。 (タスクマネージャを)起動した直後に終了したはずの「*WORD*.EXE」というプロセスが残っていませんか? 』とあります。

    using System.Runtime.InteropServices;

    Marshal.ReleaseComObject(p); //とか?、
    Marshal.ReleaseComObject(doc); //とか?、
    Marshal.ReleaseComObject(app); //と、まだあるかも.

    まとめて、
    while (System.Runtime.InteropServices.Marshal.ReleaseComObject(app) > 0) { }
    で済ませることができるように書いてありますが...?

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect(); //の3行も

    以上、「Office オートメーションで割り当てたオブジェクトを解放する – Part1」
    https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/09/office-5/
    も参考にしました。とにかく簡単ではない様な感じです。

    2017年11月3日 14:20