.NET Tips & Tutorial Web

.NET Framework 3.0

テーマ別ページ

一般

  • Windows 8時代にWPFとSilverlightはどちらが生き残れるのか? 2011.11.4
    • 今後はSilverlightよりもWPFを選択するケースがこれまでよりも多くなるのではないかと予想します。
    • Silverlightは徐々にクロスプラットフォームをあきらめていった
    • マイクロソフトが「本当の意味でのクロスプラットフォームは、HTML5だ」と考えている
    • Silverlightの居場所は徐々に業務向けに偏ってくるのではないかと考えています。
    • 現在、Windowsプラットフォーム上の業務アプリケーションで最も多いのは、Windowsフォームではないかと思います(その次はもしかしたらVisual Basic 6.0かもしれません)。従って、Windowsフォームから移行がしやすいかどうかは、WPFかSilverlightかを選択する上で重要なポイントになるのではないかと思います。
  • いま使うべき、学ぶべき.NETテクノロジはどれ? 2009.11.20
    • 遠藤 実際の現場において、やはりWPFは使われていないのでしょうか?
    • 宮崎 実際の現場を見ていても、WPFはまだまだ少ないですね。新規プロジェクトで「WPFと Windowsフォーム、どちらを使うか?」という検討に入ったとき、WPFを使った方がよりリッチなUIを構築しやすく、特にそのプロジェクトには適していると思われる場合があります。このような場合でも、例えばグレープシティ製コンポーネントのWPF版が提供されていないというような外部的な要因などが考慮されて、現場の判断でWPFの採用が見送られるケースが多々あります。
    • さらにWPFが有利な点として、WPFのスキルを身に付けると、そのサブセットであるSilverlightの開発知識も身に付けられることもありますね。
  • 他のメモリが壊れている…
    保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
    他のメモリが壊れていることが考えられます。
    • メモリアクセスバイオレーションが起きたときの例外メッセージ
    • C#側でunsafeなことをしてないのに起きる場合はODBCやDAOなどのコンポーネントの中で異常が起きているようなケースが多い。再現性低く、アプリ側で原因究明は困難

特定の処理にタイムアウトを実装するには

Application.DoEvents()の注意点

  • ループの中で画面更新するためにDoEvents()を呼ぶ場合、メッセージキューの中にメッセージが無い状態でDoEvents()を呼ぶとタスクスイッチが入り、動作が遅くなるのであまり無闇にDoEvents()を呼びすぎてはいけない。
  • かならずウィンドウズメッセージが何かポストされている状態で呼ぶように注意すること

プロセスで使っているメモリの大きさなど

  • このへんをヘルプで参照
    • System.Diagnostics.Process.PagedMemorySize
    • System.Diagnostics.Process.PeakPagedMemorySize
    • System.Diagnostics.Process.PeakWorkingSet
    • System.Diagnostics.Process.WorkingSet

簡単な処理時間計測用クラス

class ProfTime
{
  bool bInProf = false;
  long m_start;
  long m_end;

  public void Start() 
  {
    Debug.Assert(bInProf == false);
    
    m_start = DateTime.Now.Ticks;
    bInProf = true;
  }
  public void End() 
  {
    Debug.Assert(bInProf);
    m_end = DateTime.Now.Ticks;
    bInProf = false;
  }
  public long GetErapsed() 
  {
    Debug.Assert(bInProf == false);
    //Debug.Assert(m_end != m_start);
    return (m_end - m_start)/10000;
  }
  public double GetErapsedD() 
  {
    Debug.Assert(bInProf == false);
    //Debug.Assert(m_end != m_start);
    double d = (m_end - m_start);
    return d/10000;
  }
  public void End(string msg) 
  {
    End();
    Log.OutLog("PRF:" + msg + "所要時間:" + GetErapsed() + "ms");
  }
}
  • 使い方の例
    ProfTime p = new ProfTime();
    p.Start();
    
    //計測したい処理
    
    p.End("ほげほげ処理");
    etime = p.GetErapsed();

アイドルイベントの使い方

  • FormではなくApplicationのイベントである点に注意
    //適当なところにこれを入れる
    Application.Idle += new EventHandler(IdleHandler);
    
    //アイドルイベントハンドラ
    void IdleHandler(Object obj, EventArgs args)
    {
      //一回だけでやめたい場合
      Application.Idle -= new EventHandler(IdleHandler);
    
    
      //適当に何かやる
    }

IEnumeratorの実装例

  • これを実装すると何がうれしいかというと、foreach文の対象にできるようになる
     class SyokenInfoEnumelator : IEnumerator
      {
        ArrayList mAry;
        int idx;
    
        public SyokenInfoEnumelator(ArrayList a)
        {
          mAry = a;
          Reset();
        }
    
        public object Current 
        {
          get
          { 
            Debug.Assert(mAry != null);
            Debug.Assert(0 <= idx && idx < mAry.Count );
            return mAry[idx]; 
          }
        }
     
        public bool MoveNext()
        {
          if( mAry.Count <= 0)
            return false;
          else if( idx < mAry.Count ) 
            return ++idx < mAry.Count; //ここがちょっとややこしいので注意
          else
            return false;
        }
     
        public void Reset()
        {
          idx = -1;
        }
      }
  • 参考:IEnumeratorとyieldキーワード

リソースに埋めたテキストデータの取得

/// <summary>
/// リソースからテキストを取ってくる
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
String getResourceTxt(String name) 
{
	try 
	{
		System.Reflection.Assembly myAssembly =	System.Reflection.Assembly.GetExecutingAssembly();
		System.IO.StreamReader sr = 
			new System.IO.StreamReader(
			myAssembly.GetManifestResourceStream(name),
			System.Text.Encoding.GetEncoding("shift-jis"));

		//内容を読み込む
		String s = "";
		s = sr.ReadToEnd();

		/*
		// 改行を取りたければこうする。
		String  ws;
		do
		{
			ws = sr.ReadLine();
			s += ws + " ";
		}while( ws != null);
		*/

		//後始末
		sr.Close();

		return s;
	}
	catch(Exception ex) 
	{
		Debug.WriteLine(ex.Message);
		Debug.Assert(false);
		return "";
	}
}
  • このとき指定するnameは<モジュール名>.<サブフォルダ名>.<ファイル名>という感じになる。
    • nameを確認したければReflectorなどを使ってリソースのところを見るべし
  • コンパイルするときにテキストファイルのプロパティの「ビルドアクション」が「埋め込まれたリソース」になっている必要がある

Updaterサンプル

二重起動チェック

public static bool ChkDblProcess()
{
  Process p = Process.GetCurrentProcess();
  Process[] procs = Process.GetProcessesByName(p.ProcessName);

  foreach (Process wp in procs)
  {
    if (wp.Id != p.Id)
    {
      Log.Log_Write(LogType.ERROR, "同じプロセスが既に起動しています");
      return false;
    }
  }
  return true; //OK
}

二重起動チェックして起動してたら前出し

二重起動チェックでパフォーマンスカウンタが使えないという例外が出る現象

二重起動チェックで以下のようにしている場合

If (UBound(Diagnostics.Process.GetProcessesByName _
  (Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0) = True Then
    Exit Sub
End If 

以下のようなメッセージを伴う例外が発生することがある。

プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。

これは以下のレジストリキーが1になっていると起こるらしい。

HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\PerfProc\Performance\Disable Performance Counters

パフォーマンスカウンタが無効になり、上記の部分でInvalidOperationExceptionが発生するとのこと

.NETとCOM

他プロセス起動の例

using System.Diagnostics;
...
Process myProcess = new Process();
myProcess.StartInfo.FileName = "notepad.exe";
myProcess.StartInfo.Arguments = "";
myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
myProcess.Start();
myProcess.WaitForExit();

スレッド

  • スレッドID取得
    System.AppDomain.GetCurrentThreadId()
    を使うのは古い仕様なので
    Thread.CurrentThread.ManagedThreadId;
    を参照

コマンドライン引数を使いたい場合

  • Main()の引数に String[] argsを追加

ArrayListのソート

  • 中に入れるものに System.IComparable を実装する
  • 実装例
     public class CPMeshInfo : System.IComparable
     {
       public int No;
       public int Hoge;
       public int Fuga;
    
       public Int32 CompareTo(Object o)
       {
         return this.No - (o as CPMeshInfo).No;
       }
     }
  • ArrayListのSort()メソッドを呼ぶ

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-10 (木) 20:10:57 (853d)