「C#」タグアーカイブ

【Visual Studio 2022】C#でWindows Formsアプリを作成する際に使用するフレームワークの選択


.NET Framework 4.8と.NET 9のどちらを使うべきかは、プロジェクトの性質や要件によって異なります。それぞれの特徴と選択基準を整理しました。


1. .NET Framework 4.8 を選択する場合

メリット

  • 既存のレガシーアプリとの互換性
    過去のアプリケーションやライブラリと高い互換性があり、既存資産を活かせる。
  • 安定した環境
    長期間使用されてきたフレームワークで、Windows Formsの機能が成熟している。
  • 一部の企業システムで標準
    特に社内システムなど、Windows環境に依存する場合に最適。

デメリット

  • 今後の新機能の追加はない
    .NET Frameworkはバージョン4.8が最終版で、新しい機能や改善は提供されない。
  • クロスプラットフォーム非対応
    Windows専用であり、LinuxやmacOSでは動作しない。

推奨シーン

  • 既存の.NET Framework 4.x系のプロジェクトを引き継ぐ場合。
  • Windows専用のレガシーシステムを構築・保守する場合。

2. .NET 9(.NET 5以降)を選択する場合

メリット

  • 最新のパフォーマンスと機能
    .NET 9は最新のランタイムとパフォーマンス最適化が行われており、今後の機能拡張も見込める。
  • クロスプラットフォーム対応(ただし、WinFormsはWindows専用)
    一部のコードを他プラットフォームに再利用できる可能性がある。
  • 継続的なサポート
    .NET 9以降は新機能が積極的に追加され、長期的にメンテナンスされる。

デメリット

  • 既存の.NET Framework向けライブラリとの互換性が低い
    古いライブラリやプロジェクトを再利用する際に問題が発生する可能性がある。
  • WinFormsの一部機能が未実装または制限される可能性
    .NET Core以降に移行したWinFormsは完全な互換性がない場合がある。

推奨シーン

  • 新規開発で最新技術を採用したい場合。
  • 今後のメンテナンス性や拡張性を重視したい場合。

結論: 選択の目安

条件 推奨フレームワーク
既存のシステムの保守・更新 .NET Framework 4.8
新規開発で最新技術を採用 .NET 9
将来の拡張性や長期サポートを重視 .NET 9
Windows専用で古い環境が対象 .NET Framework 4.8

ポイント:

  • レガシー互換を重視するなら.NET Framework 4.8
  • 最新のパフォーマンスや将来性を重視するなら.NET 9を選びましょう。

System.Drawing.CommonとSystem.Drawingの名前空間が競合した場合の対処方法


2023年10月にSelenium.WebDriverを4.14.1にアップデートしました。

すると

System.Drawing.CommonとSystem.Drawingの名前空間が競合するといった内容のエラーが出まくりました。

エラー CS0433 型 ‘FontStyle’ が ‘System.Drawing.Common, Version=7.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51’ と ‘System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a’ の両方に存在します。

 

エラー CS0433

このエラーを解決した時の手順を残しておきます。

手順は簡単です。

ソリューションエクスプローラー

プロジェクトの上で右クリック

参照

System.Drawing.Commonを削除
(System.Drawingは消さない)

こうするだけでエラーが出なくなります。

ただし、この操作を行うと

NuGet パッケージの管理(N)

をクリックすると更新プログラム部分に色々なアップデートが現れる様になります。しょうがないので全て更新します。

更新を終えるとbinディレクトリの中にこの様に沢山のファイルが生成されます。

 

実際にはツール実行時には使用されないdllも沢山あるのですが、面倒な場合には生成されたファイルを丸ごとコピーして使うと良いです。

このバージョンにアップデートすると色々とエラーが出ました。その為1つ前のバージョンにして一先ず稼働させる事にしました。

Selenium.WebDriver 4.14.1
2023年10月15日 日曜日 (2023/10/15)


すぐに変化してしまう要素をChromeの検証ツールで調べる方法 C# Selenium Chrome


C# + Seleniumでとあるサイトのスクレイピングツールを作っていたところ、プルダウンメニューがJavaScriptでレンダリングされておりすぐに閉じてしまい、開いた状態でのXPathの取得に少し困りました。

要素を動かさずに個定する方法は無いかな~と調べていたところ、次の方法で簡単に調査する事が出来ました。

要素の上で右クリック > 検証 > Consoleタブを選択

setTimeout(() => { debugger }, 3000)

このコードをConsoleに入力し実行します。

末尾は待機させる時間(ミリ秒指定)です。

ここでは 3000ミリ秒(3秒)を指定しています。

この時間の間に要素を表示させます。

3秒だと短い場合には、10秒(10000ミリ秒)を指定すると良いです。

指定した時間が経過すると

Sourcesタブがアクティブになります。

そのタイミングでElementsタブを選択し、要素を調査する流れになります。

動く要素を検証する場合、この手順でやるわけですが、この作業はChromeのデバッガーが一癖あるのでコツをつかむまで練習した方が良いです。

コツは、スピーディーに行う事です。

 

 

 


C#+Selenium + Chrome バージョン: 95.0.4638.69(Official Build) (64 ビット) でハマったのでメモ


2021年10月29日

VS2017で開発したC#+Selenium+Chromの連動システムを実行したところ、エラーが出ました。

そこで

いつも通りの手順で

プロジェクトの上で右クリック > NuGetパッケージの管理(N)

と進めてChromeDriverの更新をしたところエラーが出まくりました><、、、

エラー解消の為に結構はまってしまったのですが、何とか色々といじってエラーが解消されました。

備忘録としてメモっておきます。

ターゲットフレームワークの変更

ずっとVersion 4のままプロジェクトをいじっていたので今回は、.Net Framework 4.6.1 にアップグレードしました。

これが根本的なエラーの解決になったのかは不明です。

NuGet パッケージの管理よりChrome Driverを更新

Chromeのバージョンアップに伴い Chrome Driverの更新も行う必要があります。

エラーが出る場合、1)の手順を行っているか確認してみてください。もともとFramework4で行おうとした時に依存関係がどうたらといったエラーが出まくっていました。

本日時点のChromeの最新バージョンはこちらです。

バージョン: 95.0.4638.69(Official Build) (64 ビット)

NuGetより更新していきます。

赤囲みの

Selenium.WebDriver.ChromeDriver 作成者: jsakamoto

を最新版にしたところ正常にC#+Selenium+Chromeが動作する様になりました。

jsakamotoという人は日本人なのかな!?

ありがとうございました!

※注意

Selenium.Chrome.WebDriver 作成者: jbaranda   v85.0.0

これは、Chromeのバージョン85までは対応していましたが最近はどうやら更新をしていない様です。

てっきりchromの最新バージョンが95になったので、これもバージョン95になっているかと思いましたが、更新されていませんでした。もう開発をやめてるっぽいです。

なので今後Chromeのバージョンアップが行われた場合には

Selenium.WebDriver.ChromeDriver 作成者: jsakamoto

をChromeのバージョンに合わせて更新する様にしましょう。

ソリューションのリビルド

ここまでの手順を行ったらソリューションをリビルドします。

ただし、この時にF5を押して普通にビルドしようとしてもエラーになってしまいます。

ビルドに失敗した場合

ChromeDriver.exe

ChromeDriver.exe_

に一旦リネームします。

そして、新に再ビルドします。

すると新に

ChromeDriver.exe

が生成されます。

この手順を行った上でビルドをしないとVisual StudioがChrome Driverのプロセスをどうやらつまんだままの状態でビルドエラーが出てしまいます。


C#+Selenium+Chrome 実行時に謎のエラーが発生:unknown error: cannot parse internal JSON template: Line: 1, column: 1, Unexpected token.


C#で作成したWindows アプリを使用してGoogle Chromeを操縦しているとなぜか突然

unknown error: cannot parse internal JSON template: Line: 1, column: 1, Unexpected token.

このエラーが出る様になりました。

デスクトップPCでエラーは出ておらず、なぜかノートPCで発生する状況が続いていました。

Visual Studio、Google Chrome・・・

色々試しました。解決は本当に大変でした。

最悪ノートPCのハード的な問題が原因だと思ってPC買い替えまで考えてました。これで10万浮いたー。

ですが、このエラーの原因はSeleniumでChromeを操縦する時に使用していたディレクトリ中のファイルが何等かの原因で破損していた事が原因でした。

一旦、

C:\ChromeData

を丸ごと削除した上で、C#(+Selenium)のプログラムを実行したところ正常に動作する様になりました。

 

本当に今回はかなりハマりました。

同じ事象が起きてハマっている方の参考になればと思います。

このブログを書いている2020年8月時点で、このエラーについて解説しているサイトは1つもありませんでした。

 


ChromeでWEB上のPDFファイルを開く際に自動でダウンロードさせる設定メモ


WEB上で公開されているPDFファイルをChromeから開くと、Chrome上で標準では、表示されます。

PDF Viewerというソフトが行っている様です。

PDFページにアクセスした時に、自動でローカルに保存をする為の方法を探していて少しはまったのでメモしておきます。

ChromeでPDFページを自動でローカルに保存する手順


 

 

右上の…というのをクリック > 設定(S)

検索ワードの有力エリアが出て来るので「pdf」と入力し検索します。

設定画面から順に辿る事も可能ですが、面倒なので検索した方が効率が良いです。

サイトの設定 をクリックします。

ページを下にスクロールしてPDF ドキュメントをクリックします。

PDF ファイルをChromeで自動的に開く代わりにダウンロードする

のチェックを入れます。Chromeではチェックした時にチェックマークが青色になります。

ここまでの手順を行えば、WEBサーバに公開されているPDFファイルをChromeからアクセスすれば、自動でローカルに保存される様になります。

 

C#+Selenium+ChromeDriverで操縦しています。

この操作をちまちま設定するのは面倒なので、C#上で設定する方法がいまいちわかりません。

手順をブログで公開している人がいるのですが、うまくいきません。

誰か詳しい方コメントにて教えてくださいm(_)m

 

 

 

 

 


C#+Seleniumでスクレイピングする時の俺的メモ


メモ書きとして残しておきます。

スクレイピングをする時にはいつもIEをC#から自動操縦して取得していましたが、Seleniumを使った方がむっちゃ楽でおすすめです。

Selenium(セレニウム)と読みます。

Seleniumには、Google Crome/Firefox/IEとそれぞれの代表的なブラウザに対応したDriverが出ています。

Visual Studioを使用してSeleniumのパッケージをダウンロードする場合

メニュー > プロジェクト > NuGetパッケージの管理(N)

からSelenium系を見つけてインストールしておきましょう。

詳しくはググって他のサイトみてください。

XPathを簡単に調べる方法

Cromeを開いて調べたいツールの上で右クリック > 検証(I) > Copy > Copy XPath

これむっちゃ便利。

一瞬でスクレイピングしたい要素のXPathを取得できちゃいます。

初めて知ったけどむっちゃ便利でした。

Chromeのバージョンがあがるとエラーが発生する

2019/4/30 Cromeをいつも通りC#から操作しようとしたところエラーが発生しました。

エラーの内容はこちらです。

session not created: Chrome version must be between 70 and 73
(Driver info: chromedriver=73.0.3683.68 (47787ec04b6e38e22703e856e101e840b65afe72),platform=Windows NT 10.0.17763 x86_64) (SessionNotCreated)

GoogleCromeのバージョンが74に上がった(手動で更新した)為に、Seleniumで使用するChromeDriverのバージョンを上げないと動作しない為に、このエラーが発生してしまっています。

GoogleCromeは原則として常に最新を使う事を推奨されています。

そこで私はChromeのバージョンをアップしました。

しかし、ChromeDriverが古くなり最新バージョン(74)に対応していない為に、今回のエラーが発生したという事です。

ChromeDiverのエラーでやったこと

メニュー > プロジェクト > 更新プログラム

Microsoft.Web.Xdt

Selenium.Chrome.WebDriver 

Selenium.WebDriver.ChromeDriver

更新モジュールが出ていたのでこれらを更新しました。

 

更新:2020/12/01

Google Chromeは月に1回以上更新が入ります。

それに合わせてChromeDriverも更新を都度行っていく必要があり

ます。

プロジェクトの上で右クリック > NuGet パッケージの管理

CHROMEと入力します。

ここで最新ドライバーが出ている場合には、それを選択しインストールを行います。

更新したモジュール

Selenium.WebDriver.ChromeDriver  作成者:jsakamoto, 14.4M 件のダウンロード

このドライバは、14.4M

つまり約1400万件もダウンロードされている事がわかります。

ダウンロード件数が多い方が世界中の人がダウンロードしており、動作検証過程で揉まれている為安定しています。

Chromeドライバーの最新が出た場合には、ダウンロード件数が大きい物から優先的にダウンロードして使う様にすると良いです。


C#のプロジェクトにバイナリファイルをリソースで組み込んで、プログラムから復元するには?


C#+Visual Studio2010でテキストファイルをバイナリ化してリソースファイルに組み込みました。

そのリソースファイルから元のバイナリファイルを生成するコードです。

 

赤文字が定義したリソースファイル名です。
byte[] bs = Properties.Resources.resource_XXX;
System.IO.FileStream fs = new System.IO.FileStream(
“test.dat”,
System.IO.FileMode.Create,
System.IO.FileAccess.Write);
fs.Write(bs, 0, bs.Length);
fs.Close();

 

ここでは、 resource_XXXと名前を付けたリソースファイルをプログラムからFileStreamを使用してtest.datファイルに出力しています。

 

 


IEの自動操縦で使用するモジュールの場所 ~ mshtml.dll と shdocvw.dll のある場所 ~


FaceBookとかの会員制サイトにログインする際に手動でID・PASSを入力するのが面倒です。そういう場合にはC#でIEを自動操縦して入力させればOKです。

IEの自動操縦で必須となるモジュール

mshtml.dll

shdocvw.dll

は、それぞれC:\Windows\System32の中に入っています。

プロジェクト上ではこれを参照しましょう。

 

 


C#で濁点の含まれる文字列検索を正常に判定させるには?


②の中から「c」が含まれているかを判定する為には、以下の太緑文字の様にコードを記述する必要があります。

①string test_value_1 = “abcdefg”;
②string test_value_2 = “abc゙defg”;

int i_test_1 = -1;
int i_test_2 = -1;

i_test_1 = test_value_1.IndexOf(“c”);
i_test_2 = test_value_2.IndexOf( “c”, StringComparison.Ordinal );

 

StringComparison.Ordinal を付けないと -1 になってしまいます。

原因は不明です。