【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

 

【C#】列挙体で複数の値を選択する

動作確認

Visual Studio 2017 C#

列挙体の定義

[Flags]
private enum EnumSample
{
    //項目が混じらないように、それぞれ立てるビットの位置を変える
    a = 0b0001,     //「0b」から始めると2進数で書ける
    b = 0b0010,
    c = 0b0100,
    d = 0b1000
}

使い方

//aとcを選択する
var sample = EnumSample.a | EnumSample.c;

//選択されているかはHasFlagを利用して確認する
if (sample.HasFlag(EnumSample.a))
{
    //こっちに来る
    Console.WriteLine("aは存在");
}
else
{
    //こっちには来ない
    Console.WriteLine("aは未存在");
}

//どの項目が選択されているかを確認したい場合は、列挙体の全項目を回してチェックできる
foreach (EnumSample enumValue in Enum.GetValues(typeof(EnumSample)))
{
    Console.WriteLine($"{enumValue} = " + sample.HasFlag(enumValue));
    /*
     * 実行結果
     * a = True
     * b = False
     * c = True
     * d = False
     */
}

【C#】コンソール出力の文字色を変更する

C#のコンソールアプリにて、表示する文字色を変更するにはForegroundColorを変更する。

Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("*****黄*****");

Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("*****緑*****");

Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("*****赤*****");

Console.ForegroundColor = ConsoleColor.Gray;
Console.WriteLine("****元の色****");

元の色はGray。 多用すると逆に見にくいので、エラー発生時などの出力の際には黄色を使うとよいかも。

【Visual Studio2017】コマンドラインからビルドすると「80131577」エラーが発生する

現象

devenv.exeをコマンドラインから実行し、ソースをビルドすると、
ERROR: An error occurred while validating. HRESULT = ‘80131577’
が発生してビルドに失敗する。

環境

Visual Studio 2017 Community

対処方法

必要なNuGetパッケージが存在していないのが原因。Visual Studioを起動し、NuGet パッケージの復元を行えばOK

【C#】【Linq】ファイル名の昇順に並べたリストを作成する

目的

ファイル名が「file1.txt」「file2.txt」「file10.txt」などの規則性がある場合に、正しくソートしたい場合を想定。 今回は、ファイル名中の数値のみを正規表現で取得し、それをソートすることで実現した。

ソースコード

var fileList = (new DirectoryInfo(filePath)).GetFiles().
    Select(x =>
    new
    {
        name = x.FullName,
        //ファイル名だけ取り出す→数字だけ残す→数値に変換する(ソート用)
        no = int.Parse(Regex.Replace(Path.GetFileName(x.FullName), @"[^0-9]", ""))
    }
    ).OrderBy(x => x.no).ToList();

【C#】slack APIを実行し、結果を取得する

目的

slackのAPIをC#から実行し、結果を受け取る

必要なもの

slack APIの実行に必要なtoken

slack上でアプリを新規作成し、OAuth Access Tokenを入手する。このとき、OAuth&PermissionsのUser Token Scopesに「files:read」をつけると、今回実行するfiles.listが実行できるようになる。

slack APIの調査(slack API Tester)

https://api.slack.com/methods/files.list/test
のようなテストページが用意されているので、こちらを使って試すことができる。
tokenは、「No token」を指定して上記のOAuth Access Tokenを指定する。
ページ下部の「Test Method」をクリックすると実行され、結果が表示される。
実行したURLも表示されるので、このURLを使う。

NuGetにてNewtonsoft.Jsonをインストールする

APIの戻り値がJSON形式で返ってくるため、各値を取得しやすいようにする。

ソースコード(WindowForms)

private const string TOKEN = "xxx-xxx-xxx-xxx-xxx";

/// <summary>
/// ボタンクリックイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param> private async void button1_Click(object sender, EventArgs e) {
//URL貼り付け var result = await GetData($"https://slack.com/api/files.list?token={TOKEN}&count=100&pretty=1");
//JObject型にキャストする var jsonValue = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(result);
//ok、files、pagingの3つの要素が返ってくるので、ここではfilesを取得 var files = jsonValue["files"]; foreach (var file in files) {
//各値を取得 Console.WriteLine(file["id"]); Console.WriteLine(file["name"]); } }
/// <summary>
/// 渡されたURLへアクセスし、返ってきた値を返す
/// </summary>
/// <param name="url"></param>
/// <returns></returns> private async Task GetData(string url) { using (var client = new HttpClient()) { var res = await client.GetAsync(url); return await res.Content.ReadAsStringAsync(); } }