【C#】XMLの予約語をエスケープする&元に戻す

エスケープする際には

System.Security.SecurityElement.Escape("<aaa>");

を利用する。

エスケープされた文字列を元に戻すには

System.Net.WebUtility.HtmlDecode("&lt;aaa&gt;");

を利用する。

違うクラスなので不安になるが、少なくともエスケープが必要な次の4つの文字

< > ” ‘ 

で問題なくデコードされた。

 

【C#】.NET Framework4.8から.NET 5へ移行(Windowsフォーム)

手順

  1. Visual Studio 2019インストール
  2. slnファイルが存在するフォルダをWindowsエクスプローラで開く
  3. Windowsエクスプローラのアドレスバーにcmdと入力してEnterキー押下
  4. try-convert -w hoge.sln と入力してEnterキー押下
  5. 以下のメッセージが表示されればコンバートは完了
    C:\~\hoge.csproj contains an App.config file. App.config is replaced by appsettings.json in .NET Core. You will need to delete App.config and migrate to appsettings.json if it’s applicable to your project.
    Conversion complete!
  6. App.configは不要とのことなので削除。hoge.csproj.oldファイルが作成されていたのでそれも削除した。
  7. hoge.slnをダブルクリックしてVisual Studioを起動。F5キー押下でアプリが起動できることを確認。
  8. このままだと何故かWindowsフォームのデザイナが表示されないため、プロジェクトの新しい項目の追加から、「フォーム(Windowsフォーム)」を追加する。
    少し待つと、元々あったフォームがデザイナ表示できるようになる。この状態になれば追加したフォームは削除してOK。移行完了!

 

感想

コンバートツールを利用するだけで.NET 5に移行できたが、これまでの.NET Frameworkのバージョンを上げるような手軽さではなく、完全な互換性もなさそうなので、移行する際には十分な検証が必要になるはず。

特に今回は小規模なプロジェクトで試したが、より複雑なものであれば失敗するかもしれない。
.NET Framework から .NET への移植の概要に移行できないパターンも記載されているのでそちらも参照のこと。

【C#】【WooCommerceNET】woocommerce_rest_cannot_viewエラーが発生する

環境

  • WordPress 5.7.2
  • WooCommerce 5.5.1
  • WooCommerceNET 0.8.3
  • Visual Studio 2019 C#

エラー内容

{
  "code": "woocommerce_rest_cannot_view",
  "message": "リソースをリストすることはできません。",
  "data": {
    "status": 401
  }
}

対処

new RestAPI()の第4引数にfalseを指定したところ、エラーが発生しなくなった。

以前は未指定(デフォルトのtrue)で問題なく使えていたので原因不明。
ここにたどり着くまでに時間がかかったのでメモとして残しておく。

【C#】正規表現で、1文字ずつタブを挿入する

//1文字ずつ、タブ(\t)を挿入する
System.Text.RegularExpressions.Regex.Replace("123456789", "(.+?)", "$1\t");

//実行結果(各数字の後にタブが挿入されている)
1	2	3	4	5	6	7	8	9	
  • “123456789”
    元の文字列
  • “(.+?)”
    検索条件(任意の1文字をヒットさせる)
  • “$1\t”
    置換条件($1=ヒットした文字が入る。\t=タブ記号)

 

【C#】正規表現で英数字を除く

文字列中の英数字を除いて、ひらがなだけにするサンプル

//実行すると「あいうえお」になる
System.Text.RegularExpressions.Regex.Replace("aあbい1う2えAおB", @"[a-zA-Z0-9]", "");

 

【Visual Studio】ソリューション内の 1 つ以上のプロジェクトが正しく読み込まれていません。エラーが発生する

内容

ソリューションファイルを開くと、以下のエラーメッセージが表示され、プロジェクトが(利用不可)の状態になる

ソリューション内の 1 つ以上のプロジェクトが正しく読み込まれていません。
詳細については、出力ウィンドウを確認してください。

このメッセージをOKを押して閉じると、以下のようにエラー原因が表示される。

原因

Zipファイルを解凍せずにそのまま開いて、slnファイルをダブルクリックして実行したから。

解凍してあげればOK

 

【C#】XML読み込み時、名前の先頭に ‘-‘ (16 進数値 0x2D) を使用することはできません。エラーが発生する

エラー内容

XmlSerializerを利用してXMLを読み込んだ際に、以下のエラーが発生した。

System.Xml.XmlException: 名前の先頭に '-' (16 進数値 0x2D) を使用することはできません。 行 49、位置 3。
   場所 System.Xml.XmlTextReaderImpl.Throw(Exception e)
   場所 System.Xml.XmlTextReaderImpl.ParseQName(Boolean isQName, Int32 startOffset, Int32& colonPos)
   場所 System.Xml.XmlTextReaderImpl.ParseElement()
   場所 System.Xml.XmlTextReaderImpl.ParseElementContent()
   場所 System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
   場所 System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)
   場所 System.Xml.XmlDocument.Load(XmlReader reader)
   場所 System.Xml.XmlDocument.Load(Stream inStream)

原因

原因は単純で、コメント「<!–」を記載したはずが「<–」になってた(びっくりマークが無い)。。。

 

【C#】【EntityFramework】「列 ‘InvariantName’ は一意であるように制約されています。」エラーが発生する

エラー内容

System.Configuration.ConfigurationErrorsException: system.data のための構成セクション ハンドラーを作成中にエラーが発生しました。: 列 ‘InvariantName’ は一意であるように制約されています。値 ‘System.Data.SQLite.EF6’ は既に存在します。 (C:\xxxxxxxx\xxxxxxxxxx.exe.Config line 11) —> System.Data.ConstraintException: 列 ‘InvariantName’ は一意であるように制約されています。値 ‘System.Data.SQLite.EF6’ は既に存在します。

原因

App.configの<system.data>にinvariant=”System.Data.SQLite.EF6″が複数記載されている場合に発生

【C#】DataRowの各項目をまとめてConsole出力する

foreach (DataRow dataRow in dataTable.Rows)
{
Console.WriteLine(
string.Join(",",
Array.ConvertAll(dataRow.ItemArray, x => x.ToString()))
);
}
  1. DataRowのItemArrayがobject[]型で返ってくるためArray.ConvertAll()でstring[]型に変換する。
  2. string.Join()で、string[]型の値を「,」区切りで文字列結合する

【C#】【Selenium】session not created~エラーが発生する

エラーメッセージ

System.InvalidOperationException: ‘session not created: This version of ChromeDriver only supports Chrome version 85 (SessionNotCreated)’

「new ChromeDriver()」を実行すると発生した

対処方法

NuGetで、Selenium.WebDriver.ChromeDriverを最新版(インストールされているChromeと同じバージョン)に上げる。

上げた後、ソリューションのクリーンを実行した後に、ビルドすればOK