#author("2024-01-12T23:40:51+09:00","default:irrp","irrp")
→[[C#関連]]

#contents

*WPF [#w32e299b]
-[[Windows Presentation Foundation - WPF .NET Framework | Microsoft Learn>https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/?view=netframeworkdesktop-4.8]] 2023
-[[WPF の概要 | Microsoft Learn>https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/introduction-to-wpf?view=netframeworkdesktop-4.8]] 2023
-[[チュートリアル - WPF .NET Framework | Microsoft Learn>https://learn.microsoft.com/ja-jp/dotnet/desktop/wpf/getting-started/wpf-walkthroughs?view=netframeworkdesktop-4.8]] 2024.1
-[[WPF入門>http://www.atmarkit.co.jp/fdotnet/chushin/introwpf_index/index.html]] 2010


*.NET Tips & Tutorial Web [#vf533357]
-[[【C#】逆コンパイルと難読化について【.NET】 - Qiita>https://qiita.com/rait0/items/4f50efc6c752374c111a]] 2022.3
-https://referencesource.microsoft.com/
-[[すぐに使えるWPF/SilverlightのUI開発パターン>http://www.atmarkit.co.jp/fdotnet/chushin/wpfsluipattern_index/index.html]]
-[[WPF入門>http://www.atmarkit.co.jp/fdotnet/chushin/introwpf_index/index.html]]
-http://ja.gotdotnet.com/quickstart/howto/
-[[WPF Tutorial Part1:http://www.codeproject.com/winfx/TransformationsIntro.asp]]
-[[Some Cool Tips for .NET:http://www.codeproject.com/useritems/tips.asp]]
-[[@ITの.NET TIPS:http://www.atmarkit.co.jp/fdotnet/dotnettips/index/index.html]]
-[[.NETのつぼ:http://park16.wakwak.com/~mimi/dotnet/top.html]]
-[[じゃんぬねっと:http://jeanne.wankuma.com/]]
-[[DOBON.NET:http://dobon.net/]]
-[[Mick Dohertys DotNet TIPS:http://dotnetrix.co.uk/]]
-[[30 minutes Regex Tutorial:http://www.codeproject.com/dotnet/RegexTutorial.asp]]
-.NETでの正規表現については正規表現のページを参照


*.NET Framework 3.0 [#u3aed439]
-[[.NET開発者のためのオンライン・リソース・ガイド>http://www.atmarkit.co.jp/fdotnet/special/onlineres2009/onlineres2009_01.html]] 2009.4.21
-[[.NET Framework 3.0を使って見よう@IT>http://www.atmarkit.co.jp/fdotnet/insiderseye/20061111dotnetfx30/dotnetfx30_01.html]]
--[[.NET Framework3.0概説>http://www.atmarkit.co.jp/fdotnet/special/dotnetfx3001/dotnetfx3001_01.html]]
-[[.NET Framework 3.0の紹介@MS>http://www.microsoft.com/japan/msdn/net/general/intronetfx30.aspx]]

*テーマ別ページ [#tc5af770]
-.NETでの文字列処理
-FlexGrid.NET関連
-.NET フォーム関連
-.NET コントロール関連
-.NET ファイルシステム関連
-C#によるExcel制御
-ADO.NET関連
-ASP.NET関連
-.NETネットワークプログラミング
-.NETによるWindowsサービスの開発メモ

-[[PINVOKE.NET:http://www.pinvoke.net/]]
--[[PINVOKE.NET Add-In for Visual Studio:http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=75122f62-5459-4364-b9ba-7b5e6a4754fe]]


*一般 [#oc58fb17]
-[[WPFのGridを動的に作成する #C# - Qiita>https://qiita.com/mkuwan/items/ad99164bcba97e1e1b5f]] 2022

-[[Windows 8時代にWPFとSilverlightはどちらが生き残れるのか?>http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_08/greatblogentry_08_01.html]] 2011.11.4
--今後はSilverlightよりもWPFを選択するケースがこれまでよりも多くなるのではないかと予想します。
--Silverlightは徐々にクロスプラットフォームをあきらめていった
--マイクロソフトが「本当の意味でのクロスプラットフォームは、HTML5だ」と考えている
--Silverlightの居場所は徐々に業務向けに偏ってくるのではないかと考えています。
--現在、Windowsプラットフォーム上の業務アプリケーションで最も多いのは、Windowsフォームではないかと思います(その次はもしかしたらVisual Basic 6.0かもしれません)。従って、Windowsフォームから移行がしやすいかどうかは、WPFかSilverlightかを選択する上で重要なポイントになるのではないかと思います。

-[[いま使うべき、学ぶべき.NETテクノロジはどれ?>http://www.atmarkit.co.jp/fdotnet/chushin/chushinmeeting_01/chushinmeeting_01_01.html]] 2009.11.20
--遠藤 実際の現場において、やはりWPFは使われていないのでしょうか?
--宮崎 実際の現場を見ていても、WPFはまだまだ少ないですね。新規プロジェクトで「WPFと Windowsフォーム、どちらを使うか?」という検討に入ったとき、WPFを使った方がよりリッチなUIを構築しやすく、特にそのプロジェクトには適していると思われる場合があります。このような場合でも、例えばグレープシティ製コンポーネントのWPF版が提供されていないというような外部的な要因などが考慮されて、現場の判断でWPFの採用が見送られるケースが多々あります。
--さらにWPFが有利な点として、WPFのスキルを身に付けると、そのサブセットであるSilverlightの開発知識も身に付けられることもありますね。

-[[他のメモリが壊れている…>http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=35127&forum=7]]
 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。
 他のメモリが壊れていることが考えられます。
--メモリアクセスバイオレーションが起きたときの例外メッセージ
--C#側でunsafeなことをしてないのに起きる場合はODBCやDAOなどのコンポーネントの中で異常が起きているようなケースが多い。再現性低く、アプリ側で原因究明は困難

-[[イベントログにエントリを書き込む>http://dobon.net/vb/dotnet/system/writeeventlog.html]]
-[[app.configには2つの用途がある>http://d.hatena.ne.jp/PoohKid/20071217/config]]
-[[.NET開発者のためのDI&AOP入門>http://www.atmarkit.co.jp/fdotnet/special/seasarnet01/seasarnet01_01.html]]
-コンピュータ名取得
 System.Environment.MachineName
-[[5分でわかるActive Reports>http://codezine.jp/a/article/aid/1583.aspx]]
-[[Windowsメッセージで文字列を渡す>http://www.codeproject.com/useritems/Send_string_by_message.asp]]
-[[Automating Undo/Redo with .NET Generics>http://www.codeproject.com/cs/library/AutomatingUndoRedo.asp]]
-[[DEVPATH を使用してアセンブリを指定する:http://msdn2.microsoft.com/ja-JP/library/cskzh7h6.aspx]]
--厳密名をつけたDLLの開発をする時などに知っておくと便利な話
 開発時に、グローバル アセンブリ キャッシュにアセンブリを繰り返し配置する代わりに、
 アセンブリのビルド出力ディレクトリを指す DEVPATH 環境変数を作成できます。
-ある色が明るい色か暗い色か判定したいとき:Color.GetBrightness()で判定できる
-[[.NETアプリを軽快にするためのGC講座>http://www.atmarkit.co.jp/fdotnet/directxworld/directxworld06/directxworld06_01.html]]
-[[Quick Introduction to PerlNET>http://www.codeproject.com/useritems/PerlNETQuickIntroduction.asp]]
-[[Using managed code to detect what .NET Framework versions and service packs are installed>http://www.codeproject.com/useritems/frameworkversiondetection.asp]]
-[[.NET Object Spy and InvokeRemote>http://www.codeproject.com/useritems/objectspy.asp]]
-[[Setting Enum's Through Reflection:http://www.codeproject.com/csharp/SetEnumWithReflection.asp]]
-[[C#グローバライズ サンプル:http://www.codeproject.com/useritems/GlobalizationSample.asp]]
-[[.NET Internationalization: The Developer's Guide to Building Global Windows and Web Applications: Chapter 11 - Custom Cultures:http://www.codeproject.com/books/CustomCultures.asp]]
-[[Mixing Managed and Unmanaged Code Using Managed C++:http://www.codeproject.com/useritems/WrappingUsingManagedCpp.asp]]
-[[リソースに画像を持たせて使う方法:http://www.microsoft.com/japan/msdn/vbasic/migration/tips/Resource/]]
-[[クリップボードの利用:http://www.microsoft.com/japan/msdn/vbasic/migration/tips/clipboard2/]]
-[[.NET Frameworkのバージョン確認方法:http://www.atmarkit.co.jp/fwin2k/win2ktips/246checkvdnfw/checkvdnfw.html]]
-[[アセンブリ署名とコードアクセスセキュリティ:http://codezine.jp/a/article.aspx?aid=424]]
--メリット1:参照DLLが変わっていないことを証明する
--メリット2:GACに登録することができるようになる
--メリット3:コードアクセスセキュリティで厳密名による設定が可能になる
-[[A Windows Explorer in a user control:http://www.codeproject.com/useritems/ExplorerTree.asp]]
-[[キーボードフック:http://www.codeproject.com/useritems/CSLLKeyboard.asp]]
-[[Processing Global Mouse and Keyboard Hooks in C#:http://www.codeproject.com/csharp/globalhook.asp]]
-[[ハッシュテーブルを使うには?:http://www.atmarkit.co.jp/fdotnet/dotnettips/125hashtable/hashtable.html]]
--[[ハッシュをArrayListにコピーしてソートするやり方:http://www11.ocn.ne.jp/~ikalu/note_csharp/cn0002.html]]
-[[システムトレイにアラーム時計を作るサンプル:http://www.microsoft.com/japan/msdn/coding4fun/inthebox/systrayalclock/default.aspx]]
-[[.NET system wide hotkey component:http://www.codeproject.com/vb/net/mclhotkeynet.asp]]
-[[DotLucene:http://www.dotlucene.net/]]
--オープンソースの全テキストサーチライブラリ.NET用
-[[リソースに埋め込んだデータを利用する:http://dobon.net/vb/dotnet/programing/bitmapresource.html]]
-[[アプリケーションアイコンの設定:http://www.atmarkit.co.jp/fdotnet/dotnettips/385appicon/appicon.html]]
-[[.NET File Format:http://www.codeproject.com/dotnet/dotnetformat.asp]] かなりマニアック
-[[日付の計算のサンプル:http://www.atmarkit.co.jp/fdotnet/dotnettips/267timespan/timespan.html]]
--DateTime, TimeSpanなどの扱い
-[[.NETパフォーマンスUPのためのコードレビュー@MSDN:http://www.microsoft.com/japan/msdn/enterprise/pag/scalenetchapt13.asp]]
-[[サービス名の列挙:http://www.atmarkit.co.jp/fdotnet/dotnettips/365winservice2/winservice2.html]]

*特定の処理にタイムアウトを実装するには [#s4cafcdc]
-http://bbs.wankuma.com/index.cgi?mode=al2&namber=9308&KLOG=22
-スレッドを起こすか、非同期デリゲートを使う

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

*プロセスで使っているメモリの大きさなど [#xffb9926]
-このへんをヘルプで参照
--System.Diagnostics.Process.PagedMemorySize
--System.Diagnostics.Process.PeakPagedMemorySize
--System.Diagnostics.Process.PeakWorkingSet
--System.Diagnostics.Process.WorkingSet


*簡単な処理時間計測用クラス [#qe633af0]
 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();


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

*IEnumeratorの実装例 [#a4ea9cb8]
-これを実装すると何がうれしいかというと、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キーワード>http://wisdom.sakura.ne.jp/programming/cs/cs2_8.html]]

*リソースに埋めたテキストデータの取得 [#a3be5681]
 /// <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サンプル [#z9b6b872]
-http://www.codeproject.com/tools/updater.asp

*二重起動チェック [#fa2d853f]
 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
 }


*二重起動チェックして起動してたら前出し [#wfd016b6]
-http://jeanne.wankuma.com/tips/process/activewindow.html

*二重起動チェックでパフォーマンスカウンタが使えないという例外が出る現象 [#j7957896]
二重起動チェックで以下のようにしている場合
 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が発生するとのこと

-[[参考URL:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=5234&forum=7]]



*.NETとCOM [#ha3e86ca]
-[[Understanding Classic COM Interoperability With .NET Applications>http://www.codeproject.com/dotnet/cominterop.asp]]
-[[COM and .NET Interoperability>http://www.theserverside.net/articles/showarticle.tss?id=ComAndDotNetInterop_Book]]


*他プロセス起動の例 [#cae62dfe]
 using System.Diagnostics;
 ...
 Process myProcess = new Process();
 myProcess.StartInfo.FileName = "notepad.exe";
 myProcess.StartInfo.Arguments = "";
 myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
 myProcess.Start();
 myProcess.WaitForExit();


*スレッド [#i5234c04]
-[[Visual C++でマルチスレッド・プログラミング>http://www.atmarkit.co.jp/fdotnet/bookpreview/bunpouvcpp_1302/bunpouvcpp_1302_01.html]]

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

-[[スレッドの実行と同期@CodeZine>http://codezine.jp/a/article.aspx?aid=135]]
--[[非同期デリゲートとスレッドプール>http://codezine.jp/a/article/aid/139.aspx]]

-[[C#によるマルチスレッド>http://ufcpp.net/study/csharp/sp_thread.html#ex_in_cs]]
-[[How to solve "Cross thread operation not valid">http://www.codeproject.com/useritems/AccessControlFromThread.asp]]
-[[BackgroundWorkerコンポーネントの説明:http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html]] (2.0以上)
-[[.NETによるマルチスレッド解説@IT:http://www.atmarkit.co.jp/fdotnet/mthread/mthread02/mthread02_01.html]]
-[[.NET マルチスレッドプログラミングbyDOBON:http://codezine.jp/a/article.aspx?aid=144]]

*コマンドライン引数を使いたい場合 [#a3166b0b]
-Main()の引数に String[] argsを追加

*ArrayListのソート [#a836ada3]
-中に入れるものに 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