====== dotNET ====== ===== user.configの保存先 ===== ^OS^フォルダ^ |Vista,Windows7~|C:\Users\(ユーザ名)\AppData\Local\\\\user.config| |XP|C:\Documents and Settings\(ユーザ名)\Local Settings\Application Data\\\\user.config| ===== Windowsのディレクトリ構成ガイドライン ===== [[http://d.hatena.ne.jp/torutk/20110604/p1|Windowsのディレクトリ構成ガイドライン]] ガイドライン抜粋\\ Program Files、ユーザー固有・アプリケーション共有データ\\ * C:\Program Files\\ プログラム、ソフトウェアコンポーネント置き場\\ 通常ユーザーはこの場所に書き込み権を持たないため、ユーザーデータやアプリケーションデータはここへ置くべきでない。 * C:\ProgramData: コンピューター上のすべてのユーザーが共有するアプリケーションデータ置き場\\ C:\Users\<ユーザー名>\AppData: ユーザー固有のアプリケーションデータ置き場\\ AppData以下はさらに階層構造を持つ * C:\Uses\<ユーザー名>\AppData\Roaming コンピュータに依存しないユーザー固有のアプリケーションデータ置き場\\ アプリケーションデータのうち、ユーザーカスタマイズ情報などで、ユーザーの操作を伴い変更するもの * C:\Uses\<ユーザー名>\AppData\Local このコンピュータに固有のユーザー固有のアプリケーションデータ置き場\\ アプリケーションデータのうち、一時的で破棄されてもアプリケーション動作に支障のないもの(**ログ、デバッグ情報など**) コンピュータに依存しないユーザー固有のアプリケーションデータでも、ユーザーの操作なしに再生成できるデータ(ユーザーが作成するカスタマイズ情報や設定情報は含まない) * C:\Users\<ユーザー名>\AppData\LocalLow ユーザー固有の特権(管理者権限)なしに扱えるアプリケーションデータ [[http://dobon.net/vb/dotnet/file/getfolderpath.html|特殊ディレクトリのパスを取得する]] ^Environment.SpecialFolder \\ 列挙体のメンバ^環境変数名^場所の例^ |UserProfile|%USERPROFILE%|C:\Users\<ユーザー名>\| |ApplicationData|%APPDATA%|C:\Users\<ユーザー名>\AppData\Roaming| |なし|%TEMP%|C:\Users\<ユーザー名>\AppData\Local\Temp| |LocalApplicationData|%LOCALAPPDATA%|C:\Users\<ユーザー名>\AppData\Local| |なし(配下はある)|%PUBLIC%|C:\Users\Public| |CommonApplicationData|%PROGRAMDATA%|C:\ProgramData| ===== DebugとReleaseの違い ===== Releaseの方がコードサイズが小さくなります。\\ [[https://qiita.com/ChanyaKushima/items/a9dc549977cd44adb300|C#のDebug/Releaseコンパイルはどう違うの?]] === Debug === * 条件付きコンパイルの定数:DEBUG,TRACE * コードの最適化:ON * デバッグ情報:FULL === Release === * 条件付きコンパイルの定数:TRACE * コードの最適化:OFF * デバッグ情報:pdb-only ===== 初回起動が遅い ===== 「エンド・ユーザーは、0.5秒のフリーズでストレスを感じ、3秒のフリーズはバグだと思う」。昔、冗談半分に言ってみた言葉だが、回りの反応を見るに、割とみな思っていることらしい。\\ https://atmarkit.itmedia.co.jp/ait/articles/1109/30/news126.html [[https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/1b743b77-d208-46d2-9fcf-25866384fc5b/netframework1245012503125221246512540124711251912531124342102122238?forum=csharpgeneralja|.NetFrameworkアプリケーションを初回読み込みから速くするには? - MSDNフォーラム]] 別の.NETアプリケーションが既に動作していれば起動は速いがPC起動時など遅い。\\ 理由は、.NET Framework 自体のロードをファイルシステム・キャッシュ上に乗せるためで「コールド スタート」と呼ばれる、別の.NETアプリケーションが既に動作していると「ウォーム スタート」となる。\\ ウォーム スタートは、主要なCLRコンポーネント用のページの殆どが既にメモリに読み込まれているときに発生し、貴重なディスクアクセス時間が節約されます。このため、マネージ アプリケーションを再度実行すると、初回よりも短い時間で起動します。\\ [[https://msdn.microsoft.com/ja-jp/library/cc656914(v=vs.110).aspx|アプリケーションの起動時間]] コールドスタートアップはIOバウンドだから当然ngenでは速くならない。2度目以降の起動時間が短くなるのは、OSが一度読んだブロックをメモリにキャッシュしているから。 起動を速くするににプリコンパイルする「Ngen.exe」を使用する方法がある。インストール時にカスタムアクションでNgen.exeでプリコンパイルするといった手法もある。\\ [[https://docs.microsoft.com/ja-jp/previous-versions/visualstudio/visual-studio-2010/3hwzzhyd(v=vs.100)|チュートリアル : カスタム動作を使用して、インストール中にアセンブリをプリコンパイルする]]\\ 但しプリコンパイルの効果は永続的ではなく、.NET Frameworkなどのバージョンが変わったりなどの条件によって効果が消えてしまう。\\ * [[https://msdn.microsoft.com/ja-jp/library/6t9t5wcf(v=vs.90).aspx|ネイティブ イメージ ジェネレータ (Ngen.exe)]] * [[https://code-examples.net/ja/q/13aa43c|ngen.exeはどのようにいつ動作しますか?]] .NET 4.5以降では、NgenがWindowsサービスとして動いている(Auto-Ngen)\\ 基本的に、.NETランタイムは、管理対象アプリケーションの使用ログを生成します。システムがアイドル状態の場合、自動メンテナンスタスクがバックグラウンドで実行され、ネイティブイメージが生成されます。これにより、開発者はNGenを明示的に扱う必要がなくなります。※但し、GACアセンブリのみ\\ ※.NET 5以降(旧.NET Core)では、GACの概念は存在しなくなる。\\ [[https://www.infoq.com/jp/news/2021/02/net-5-breaking-changes-2/|.NET 5の重大な変更点を歴史的テクノロジの面から見る]] 他にも64bit OS上だとJITのパフォーマンスが悪くなるとの報告がある。x86で作成すると良いらしい。\\ [[https://karuakun.wordpress.com/2014/02/03/%E3%82%A2%E3%83%97%E3%83%AA%E8%B5%B7%E5%8B%95%E3%81%AB%E9%99%90%E3%82%8C%E3%81%B0%E3%82%AF%E3%82%A2%E3%83%B3%E3%83%88%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AF%E4%BB%8A%E3%81%AE%E3%81%A8%E3%81%93%E3%82%8Dx8/|アプリ起動に限ればクアントアプリは今のところx86ターゲットのほうが良いのか?]]\\ ※.NET Framework4.6以上の 64ビットモードから.NET環境に最適化されたJITコンパイラ「[[https://www.publickey1.jp/blog/13/net64jitryujit.html|RyuJIT]]」で動作するようになり速くなった。 Windows上で電子署名されたロードモジュールを実行すると10秒以上起動にかかることがあるとのことで、対処方法としてアプリケーション構成設定で「generatePublisherEvidence」を「False」に設定する。\\ [[http://rinta.hatenablog.com/entry/20111204/p1|Windows上で電子署名されたロードモジュールを実行するとなーんか遅い?という話]] Windows10では「高速スタートアップ」機能があり、パソコンの起動を速くするためシャットダウン時にメモリやCPUなどの状態を保存しておくようになっている。これにより初回の初回起動以外は速くなる。 その他 * [[https://qiita.com/m_hama123/items/f8cb0ddf192099491bc7|.NET Frameworkがアセンブリを検索する順番と確認するためのツール]] * [[https://qiita.com/mintcandy/items/9d5cfff8748424dc9109|C#のプログラムが遅いときにもしかしたら高速化するかもしれないたった1行のおまじない [STAThread]]] ===== アセンブリの厳密名と特定バージョンについて ===== ==== 厳密名について ==== 厳密名とはVisual Studioなどでアセンブリファイルの参照プロパティで「厳密な名前」と記載されている項目になります。\\ プロパティで「True」となっているアセンブリファイルは厳密名を設定されています。\\ 基本的にMicrosoftやOracleといった企業が配布しているファイル、バージョンを縛りたい場合に設定されます。 === 厳密名の構成について === 厳密名は以下の4要素によって構成されています。\\ ^要素名^ |ファイル名(拡張子無し)| |バージョン番号| |カルチャID| |公開キートークン| 参照URL:\\ https://msdn.microsoft.com/ja-jp/library/wd40t7ad(v=vs.110).aspx http://d.hatena.ne.jp/tekk/20110326/1301133863 ==== 厳密名による特定バージョンの縛りについて ==== 特定バージョンについては厳密名と同じで、アセンブリファイルの参照プロパティで確認できます。\\ 特定バージョンを設定するためには、以下の2つの条件を満たす必要があります。\\ * 参照するアセンブリファイルに厳密名が設定されている。 * 参照するアセンブリファイルがGACに登録済み 特定バージョンがTrueの場合、参照設定しているアセンブリのバージョンが一致しないとコンパイル時にエラーや警告が発生します。\\ * [[http://d.hatena.ne.jp/tekk/20120214/1329232675|参照設定のプロパティ設定。特定バージョンの挙動について]] * [[https://msdn.microsoft.com/ja-jp/library/51ket42z(v=vs.110).aspx|MSDN アセンブリのバージョン管理]] ===== ClickOnceの発行 ===== ==== オフラインの必須コンポーネント ==== * [[https://qiita.com/hidekuro/items/c0f7a11637a63078be5c|"アプリケーションと同じ場所から必須コンポーネントをダウンロードする" で上手くいかない場合]] * [[https://qiita.com/yaju/items/b81710fcde6dc4986f29|ClickOnceの必須コンポーネントの警告マーク解消方法]] ==== ブートストラップファイルの場所 ==== ^VS2008|C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages| ^VS2010|C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\Packages| ^VS2013|C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\Bootstrapper\Packages| ^VS2015|C:\Program Files (x86)\Microsoft Visual Studio 14.0\SDK\Bootstrapper\Packages| ^VS2017|C:\Program Files (x86)\Microsoft SDKs\ClickOnce Bootstrapper\Packages| ==== バージョン管理 ==== ClickOnceでは、アセンブリバージョンで設定ファイル(user.cofig)が作成されるので、アセンブリバージョンを変更してしまうと、前バージョンの設定を引き継げません。ってことが発覚!\\ ClickOnceを使う場合は、発行バージョンで管理するってことになります。\\ よって、アセンブリバージョンとファイルバージョンは1.0.0.0のままにしておく。 ==== 既にインスール済みでインスールできない ==== ユーザーのアプリケーションデータフォルダに何らかの不具合原因となるファイルが残っているのが原因なので、「C:\Users\<ユーザ名>\AppData\Local\Apps\」以下のフォルダの削除を行う。\\ [[https://blog.regrex.jp/2016/09/02/post-972/|ClickOnceでの再インストールでエラー発生]]\\ [[http://maigo-pg.seesaa.net/article/400170126.html|ClickOnceのダウンロード先フォルダのクリアバッチ]] アンインストール後に再度インスールしようとした場合、ClickOnceのエラー詳細にて既にインスール済みと判断される。\\ Setupがゴミ箱にある場合でも、既にインスール済み扱いになってしまうので、対応としてゴミ箱から削除する。 === Mage.exeによりクリアする方法 === 上よりスマートな方法として、オンライン・キャッシュ領域をクリアする\\ [[https://www.atmarkit.co.jp/fdotnet/dotnettips/456cleanonlinecache/cleanonlinecache.html|ClickOnceオンライン・キャッシュ領域をクリアするには?]] Mage -cc ==== Chromeでは拡張機能が必要 ==== ChromeでClickOnceを動作させるには、下記のどちらかの拡張機能が必要となる。 * [[https://chrome.google.com/webstore/detail/clickonce-for-google-chro/kekahkplibinaibelipdcikofmedafmb?hl=ja|ClickOnce for Google Chrome]] * [[https://chrome.google.com/webstore/detail/windows-remix-clickonce-h/dgpgholdldjjbcmpeckiephjigdpikan|Windows Remix ClickOnce Helper]] ==== デジタル証明書のタイムスタンプ ==== >Done Adding Additional Store >SignTool Error: The specified timestamp server either could not be reached or returned an invalid response. "timestamp.globalsign.com/scripts/timstamp.dll"は、もう古い。新しい所有者であるDigiCertは移行させよ。\\ https://stackoverflow.com/questions/9714798/http-timestamp-verisign-com-scripts-timstamp-dll-not-available %cur%signtool.exe sign /fd sha256 -f %cur%test.pfx -t http://timestamp.globalsign.com/scripts/timstamp.dll setup.exe ↓ %cur%signtool.exe sign /fd sha256 -f %cur%test.pfx -tr http://timestamp.digicert.com?alg=sha256 setup.exe ===== クラッシュする場合 ===== .NET4.0以降はメモリアクセス違反「AccessViolationException」等になるとアプリケーションが終了する。 >.NET Framework 4 以降で挙動が変更されたことにはそれなりに理由があります。というのも、すでにメモリアクセス違反が発生してしまったものを復旧しつつ挙動させることは極めて困難だということです。保証できない状態になっているのを無視してアプリケーションを継続してしまう場合がほとんどなので、それぐらいならアプリケーションをクラッシュさせる方がよほどマシとの考えでしょう。中途半端になって 2 次災害を引き起こすよりも突然の死を選ぶ方が安全である、と。 [[http://blog.xin9le.net/entry/2015/07/22/053738|AccessViolationExceptionを捕捉できるようにする]] 構成ファイル (*.config) に 要素を入れることで解決できます。 ===== Windows 10の.NET Frameworkインストール対応 ===== * .NET Framework 4.6が標準インストール * .NET Framework 1.1は手動でインストール可能 * .NET Framework 2.0~3.5は標準ではインストールされていない。 Windowsコンポーネントで.NET Framework 3.5(.NET 2.0 および 3.0 を含む)で有効にする必要がある。\\ オフライン上なら自動ダウンロードでインストールは容易に出来る。\\ オフライン環境の場合、Windows 10メディアが必要とのこと\\ 未確認であるが、グループポリシーエディターの変更と代替ソース指定によりメディア不要でインストールが可能\\ https://teratail.com/questions/177835 .NET Framework 3.5が必要な場合、.NETアプリケーション起動時に下記の確認ダイアログ画面が表示される。\\ {{:it技術:net35インストール確認.png?400|}} ===== 高DPI対応 ===== ==== WinForm ==== 高DPI対応するために、app.manifest ファイルを追加して、dpiAwareをtrueに設定する。\\ manifest ファイルの配布は不要。\\ [[https://blogs.msdn.microsoft.com/ttanaka/2014/08/22/dpihigh-dpi-3-12503/|アプリの高DPI(High DPI)対応について 第3回 ~ マニフェストでアプリのDPI対応レベルを変更する ~]] 「dpiAware」の設定を「true」または「true/PM」または「per monitor」に設定する。\\ 違いは下記参照(※「true/pm」と「per monitor」は同じ意味)\\ [[http://blog.itparadise.jp/?p=802|[C#][VB.NET]Windows Formアプリケーションで表示がぼやけるのを防ぐ]] true === ClickOnceアプリケーションの場合 === >ClickOnce用のマニフェストファイルとバッティングするのか、dpiAware=Trueの属性を既存のapplication.manifestに追加するとプログラムのダウンロードエラーが発生します。 [[https://social.msdn.microsoft.com/Forums/ja-JP/5051d15c-6e2a-4fc8-aa26-df0f466caf64/clickonce12450125031252212465125401247112519125311239839640dpi23550?forum=vsgeneralja|ClickOnceアプリケーションの高DPI対応方法について]] Windows APIで対応する。 [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool SetProcessDPIAware(); [STAThread] static void Main() { if (Environment.OSVersion.Version.Major >= 6) SetProcessDPIAware(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ==== WPF ==== [[http://8thway.blogspot.com/2017/04/wpf-per-monitor-dpi4.html|WPFのPer-Monitor DPIサポート(その4)]] true/PM PerMonitorV2, PerMonitor ===== Tips ===== ==== staticクラス ==== クラス自体を static と宣言することで、インスタンス作成を禁止し、static 宣言したクラスのインスタンスが複数作成できないようにできます。 * staticクラスは継承元として使えず、ほかのクラスが継承することもできません。 * プロパティのセットはメソッドの記述が必要 [[http://takachan.hatenablog.com/entry/2016/01/04/211414|C# の static クラスとシングルトン考察]] ==== 複数選択のコンボボックス ==== 標準のコンボボックスでは複数選択はできない。よってカスタムコントロールを作成しないと実現できない。 どちらも C# で作成されている。 * [[https://www.codeproject.com/Articles/21085/CheckBox-ComboBox-Extending-the-ComboBox-Class-and|CheckBox ComboBox Extending the ComboBox Class and Its Items]] * [[https://www.codeproject.com/Articles/31105/A-ComboBox-with-a-CheckedListBox-as-a-Dropdown|A ComboBox with a CheckedListBox as a Dropdown]] * [[https://www.codeproject.com/Articles/563862/Multi-Select-ComboBox-in-WPF|Multi Select ComboBox in WPF]] ==== その他 ==== * [[https://garafu.blogspot.jp/2015/07/c-enum.html|C# で enum と int 、stringを相互に変換する方法]] * [[http://c-sharp-guide.com/?p=28|DataTable 特定カラムを指定して削除する方法]] * [[https://qiita.com/tanakaworld/items/eda69da263e24adfa07d|【C#の定数】const と readonly、static readonly の使い分け]] * [[https://oshiete.goo.ne.jp/qa/1805111.html|TextBoxでEnterキーを押すと、にあるButtonを押したのと同じ効果を出す方法]] * [[http://www.northwind.mydns.jp/samples/blog/c-2/yyyymmddhhmmss%E5%BD%A2%E5%BC%8F%E3%81%AE%E6%97%A5%E4%BB%98%E3%82%92-datetime-%E3%81%B8%E5%A4%89%E6%8F%9B/|“YYYYMMDDHHMMSS”形式の日付を DateTime へ変換(C#)]] * [[https://www.codeproject.com/Questions/722877/DataTable-to-string-array|DataTable to string array]]