Debugビルドのときにはログ出力されるが、Releaseビルドに変えるとログ出力されない問題に遭遇(正確には、Relaseビルドで「最適化コード」にチェックが付いた状態)。
log4netのバージョンは、v2.0.17
Program.csのMainメソッドの一番先頭で、以下のコードを書けばログ出力されるようになった!
XmlConfigurator.Configure();
逆に、なぜDebugビルドのときに出力できていたのかが謎だが、とりあえず先に進む・・・
Microsoft.Web.WebView2.WinForms.WebView2の以下の赤枠部分を非表示にする。
次のコードのように、非表示にしたいアイコンを複数指定可能。
webView.CoreWebView2.Settings.HiddenPdfToolbarItems =
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.ZoomOut /*縮小*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.ZoomIn /*拡大*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.FitPage /*幅に合わせる*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.Rotate /*回転*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.PageLayout /*ページ表示*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.Search /*検索*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.Save /*上書き保存*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.FullScreen /*PDF全画面表示を入力する*/ |
Microsoft.Web.WebView2.Core.CoreWebView2PdfToolbarItems.MoreSettings/*設定など*/;
try-convertというツールを利用して、以下の手順でコンバートする(Visual Studio 2022で作成した.NET Frramework4.8のWindowsフォームの前提)。
※実行する前に全ファイルを別フォルダなどにコピーしてバックアップしておくこと!
コンバートは自動でバックアップしてくれず、そのままプロジェクトが書き換えられるので注意!
これで、とりあえず.NET6としてコンバートが完了した。
以下の旧プロジェクトファイルが残るので、これらは削除してOK
「XXX.csproj.old(C#の場合)」「XXX.vbproj.old(VB.NETの場合)」
以下に、コンバート後に手修正した問題点を随時追記していく。
「警告 CA1416 この呼び出しサイトはすべてのプラットフォームで到達可能です。’Font’ は ‘windows’ でのみサポートされています。」というような「CA1416」の警告が出た場合は、とりあえず以下のように警告をつぶすことができる。
C#
#pragma warning disable CA1416 LabelText.Font = new System.Drawing.Font("Meiryo UI", 21.75F); #pragma warning restore CA1416
VB.NET
#Disable Warning CA1416 LabelText.Font = New System.Drawing.Font("Meiryo UI", 21.75F) #Enable Warning CA1416
上記のように#から始まるディレクティブを使って、警告がでないようにする。
フォーム自体のフォントが「Yu Gothic UI, 9pt」になるので、これを「MS UI Gothic, 9pt」に変更すれば元のデザインのままになった。
.NET Framework4.8のときは、以下を実行すると既定のブラウザで指定したURLのページが表示されていた
System.Diagnostics.Process.Start("https://juraku-software.net");
しかし、.NET6だとこれを実行すると「System.ComponentModel.Win32Exception: ‘An error occurred trying to start process ‘https://juraku-software.net’ with working directory ‘C:\~\bin\Debug\net6.0-windows’. 指定されたファイルが見つかりません。’」というエラーになってしまう。
そのため、.NET 6では以下のように修正する。
C#
var processStartInfo = new ProcessStartInfo { UseShellExecute = true, FileName = "https://juraku-software.net" }; System.Diagnostics.Process.Start(processStartInfo);
VB.NET
Dim processStartInfo As New ProcessStartInfo With { .UseShellExecute = True, .FileName = "https://juraku-software.net" } System.Diagnostics.Process.Start(processStartInfo)
こういう実行時エラーが一番怖い・・・挙動を変えないで欲しかった・・・
フォーム自身(this)のControlsの中から、OfTypeを利用してLabelのみを抜き出せばOK
foreach (Label label in this.Controls.OfType<Label>()) { label.ForeColor = Color.Red; }
また、例えば対象のラベル名がlabel1~label5である場合、以下のように名前でFindすることもできる。
for (int i = 1; i <= 5; i++) { Control label = this.Controls.Find("label" + i, true).FirstOrDefault(); if (label is Label) { label.ForeColor = Color.Red; } }
まず、AwayFromZeroを指定しない場合の例を以下に記載した。
期待通りになる場合と、ならない場合があるので問題に気付きにくく、厄介!
? Math.Round(100.5) 100 ? Math.Round(101.5) 102 ? Math.Round(102.5) 102 ? Math.Round(103.5) 104 ? Math.Round(104.5) 104
以下のようにMidpointRounding.AwayFromZeroを指定すると期待した通りに四捨五入してくれる。
? Math.Round(100.5, MidpointRounding.AwayFromZero) 101 ? Math.Round(101.5, MidpointRounding.AwayFromZero) 102 ? Math.Round(102.5, MidpointRounding.AwayFromZero) 103 ? Math.Round(103.5, MidpointRounding.AwayFromZero) 104 ? Math.Round(104.5, MidpointRounding.AwayFromZero) 105
System.ArgumentNullException: オブジェクト グラフを Null にすることはできません。 パラメーター名:graph 場所 System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) 場所 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
BinaryFormatterのSerialize()の第2引数に渡す値がnullだった。。。
エラーメッセージが分かりにくかったのでメモ。
次のようなSampleDataというクラスがあるとする。
public class SampleData { public int Id; public string Name; }
ここでは、SampleDataのNameが同一のデータが何件存在するかをカウントする。
var sampleDataList = new List(); sampleDataList.Add(new SampleData() { Id = 1, Name = "山田" }); sampleDataList.Add(new SampleData() { Id = 2, Name = "田中" }); sampleDataList.Add(new SampleData() { Id = 3, Name = "鈴木" }); sampleDataList.Add(new SampleData() { Id = 4, Name = "山田" }); foreach (var itemCount in sampleDataList.GroupBy(x => x.Name) .Select(x => new { Name = x.Key, Count = x.Count() })) { Console.WriteLine($"{itemCount.Name} 件数:{itemCount.Count}"); }
実行結果
山田 件数:2 田中 件数:1 鈴木 件数:1
Done Adding Additional Store SignTool Error: An unexpected internal error has occurred. Error information: "Error: SignerSign() failed." (-2146869243/0x80096005)
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\signtool.exe" sign /fd sha256 /f %証明書パス% /p %証明書パスワード% /tr http://timestamp.digicert.com /d %アプリ名% %EXEパス%
ポイント:http://timestamp.sectigo.com/rfc3161ではなく、http://timestamp.digicert.comとすればOK
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\signtool.exe" verify /pa "C:\temp\sample.exe"
実行結果
File: C:\temp\sample.exe Index Algorithm Timestamp ======================================== 0 sha256 RFC3161 Successfully verified: C:\temp\sample.exe
ポイント