trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

Visual Studio 2015 Xamlで参照しているクラスやリソースが見つからない

Visual Studio 2015でのお話。他のバージョンのVisual Studioでもそうかもしれない。少なくともVisual Studio 2013はそうだ。なぜなら解決策が書いてあったページの症例がVisual Studio 2013だったからだ。

 

Xamlで参照しているクラスやリソースが見つからないと出るようになった。リソースは検索中にエラーが発生しましたなどと言われる。

この状態でもコンパイルできて正常実行される。クリーンしたりリビルドしても全く症状は変わらない。
コンパイルできるので明らかにXamlのデザイナーの問題っぽい。

で、検索してみるとビンゴのサイトがあった。

 

c# – WPF:名前が名前空間に存在しません
https://codeday.me/jp/qa/20190301/342167.html

 

このサイトによると、ターゲットプラットフォームがx64ならx86にしろとあった。
正に私はx64に途中で変更したのであった。x86ではなく、Any CPUにしたらあっさりとこの不思議な現象は消えた。

やれやれ・・・

 

 

Visual Studio 2010での不思議。「○○クラスは○○で既に定義されています」

ちょっと不思議なことがありました。

Visual Studio 2010(以下、VS2010)で改修作業を行ってコンパイルしたところ、hogefugaクラス(仮名)が「hogefugaクラスは既に定義されています。」と突然エラーになった。

VS2010で検索するも他にヒットせず。エクスプローラーで直接ファイル内を検索してみてもヒットせず。
で、このクラスをプロジェクトから除外するとこのクラスが無いと言われコンパイルエラーになる。この時点で謎。

 

再度、このクラスをプロジェクトに加えてみたが同じくエラー。試しに名前をhogefuga1に変えてみると、今度は「hogefuga1クラスは既に定義されています。」となかなかシュールな謎。
この時点でVS2010の再起動を考えたが、最後の手段としてもう少しあがいてみる。

 

気を取り直して、hogefugaクラスをバックアップした後、VS2010のソリューションエクスプローラーから完全に削除してみる。すると、hogefugaクラスの読み込みに失敗しましたというさらにわけわからない謎。
ちなみに新しくクラスを作成してみたが、そちらはエラーにならない。

 

仕方ないのでVS2010を再起動。

するとあっさり復旧。何だったんでしょうね?直ったからまぁ、いいけど。長年VS2010を使ってるけど、こんなの初めてだなぁ。ちなみにWindows 7 Ultimate 64bit上でのお話でした。

Visual Studioでプロジェクトをコピーして違うプロジェクトを作る時の注意点

Visual Studioでプロジェクトをコピーして違うプロジェクトを作る時の注意点をいつも忘れるので備忘録的な。

1.Visual Studioで新しいプロジェクトを普通に作る。

   ↓

2.エクスプローラーでコピー元のプロジェクトのフォルダーやらファイルやらをコピー先の新しいプロジェクトへコピー。Vsual Studioでの作業ではなく、エクスプローラーを使った単純なフォルダーとファイルのコピーね。

【注意点1】
この時、クリスタルレポートのファイル(*.rpt)があれば、それだけコピーして(*.cs)はコピーしない方がよい。あると(*1.cs)みたいに語尾に1が付いたファイルができてしまう。まぁ、それでもいいんだけど美しくない。
ちなみに(*.cs)ファイルは、クリスタルレポートのファイル(*.rpt)を開いて保存すれば勝手にできる。クリスタルレポートのファイル(*.rpt)を右クリックして「カスタムツールの実行」でも生成される。

【注意点2】
App.configのみコピーしても、プロジェクトのプロパティの設定を見ても空のまま。
Propertiesフォルダーにある、
Settings.Designer.csとSettings.settingsもコピーすること。

   

3.Visual Studioで先ほど作成した新しいプロジェクトを開き、ソリューションエクスプローラーの上にあるボタンで「すべてのファイルを表示」。
これで全てのファイルが見えるようになったので、それを選んで右クリックして「プロジェクトに含める」

   

4.新しいプロジェクトで多くのファイルに散乱している古いプロジェクト名を新しいプロジェクト名に一括置換。

 

以上、だいたい動くようになるはず。ちなみに作成したDataSetの関連のファイルが5つぐらいあるのだが、これらもそのままコピーして、ファイル内部の旧プロジェクト名を新プロジェクト名に一括置換すればOK。

【訂正 2019-02-16】

データセット名.Designer.cs内にある名前空間名を修正する必要がありますね。

 

 

DataTableの設計におけるLINQで集計する列のデータ型

DataTableの列を集計する場合、以下のように書くことが多いと思います。

items[1] = dataTable1.AsEnumerable()
      .Where(p => p.区分 == "予測")
      .Sum(p => p.金額);


この時、個々のレコードの金額はint型を超えることがなくても、Sumした結果がint型を超えると
「算術演算の結果オーバーフローが発生しました。」
というエラーが発生します。
先ほど、このバグ対応をしました。具体的には、金額のint型をdecimal型に変えただけです。
下期になり、通期の金額を合計しようとして桁あふれしてしまったようです。実行時エラーはやっかいですね。
というわけで、LINQで集計するのであれば集計した結果を保持できる型で設計しましょうというお話でした。

でもね、列のデータ型はint型のままとして

      .Sum(p => (decimal)p.金額);

でもいいんだよ。本来はDataTableの列の型がintでいいならintで設計すべきで、LINQでSumに対応するのが正解なんでしょうね。
でも、いつかこのアプリを改修した際に、また以下のようにdecimalを付け忘れてしまうかもしれない。
そうするといつかまた実行時エラーが出てしまう。それが嫌だったんでDataTable側で対応しちゃいました。

      .Sum(p => p.金額);

本来はそうかもしれない。でも、リスクなど総合的に考えた時、本来の道を行かないことだってあるのかなーと。

いずれにしても実行時エラーになりやすいんで気を付けましょうね。(自戒)

ClaudiaIDE 2.0.0になってVisual Studio2015、2017で動かない

私の環境だけかもしれませんが、ClaudiaIDE 2.0がVisual Studio 2015および2017で動かなくなりました。パッケージを読み込めませんでしたとエラーになる。再インストールしてもダメ。

よくみるとバージョンが2月1日に2.0.0に上がっている。動かなくなったのが2月2日にVisual Studio 2015、2017を立ち上げた時。よって、2.0.0が怪しい。

1.28.5に戻して復旧。

しばらく「この拡張機能を自動的に更新する」のチェックを外しておこう。

 

それにしても、ClaudiaIDEが無くなるとプログラミングの意欲が半減するのはなぜだろう・・・

 

Microsoft関連のフリーの開発ツールがまとまっていました

Microsoft関連のフリーの開発ツールがまとまっていました。自分の備忘録としても載せておきます。

Microsoft Hearts Programmers! 11 Free Development Tools From MS

www.makeuseof.com

数字およびアルファベットを半角から全角へ、またはその逆の変換を行う

以下のサンプルコードで使用している変換の考え方は、ネット上でいくつか見かけて参考にさせていただいたのですが、それをRegex.Replaceとラムダ式を使って簡潔に書いてみました。
ついでにstringの拡張メソッドとして定義しています。
ちなみに以下で使用している変換の考え方というのは、文字コード上、0から9、0から9、aからz、aからz、AからZ、AからZはそれぞれ連続していますので、それぞれのグループの最初の一文字から変換する一文字との差分は、半角と全角で同じであることを利用しています。
例えば、3であれば0からの差分と3の0からの差分は同じですから、3を3に変換する場合は、3の0からの差分を、0に足せば3になります。

    static class 拡張メソッド
    {

        /// <summary>
        /// 半角数字を全角数字に変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string HanToZenNum(this string s)
        {
            return Regex.Replace(s, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString());
        }

        /// <summary>
        /// 全角数字を半角数字に変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string ZenToHanNum(this string s)
        {
            return Regex.Replace(s, "[0-9]", p => ((char)(p.Value[0] - '0' + '0')).ToString());
        }

        /// <summary>
        /// 半角アルファベットを全角アルファベットに変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string HanToZenAlpha(this string s)
        {
            var str = Regex.Replace(s, "[a-z]", p => ((char)(p.Value[0] - 'a' + 'a')).ToString());

            return Regex.Replace(str, "[A-Z]", p => ((char)(p.Value[0] - 'A' + 'A')).ToString());
        }

        /// <summary>
        /// 全角アルファベットを半角アルファベットに変換する。
        /// </summary>
        /// <param name="s">変換する文字列</param>
        /// <returns>変換後の文字列</returns>
        static public string ZenToHanAlpha(this string s)
        {
            var str = Regex.Replace(s, "[a-z]", p => ((char)(p.Value[0] - 'a' + 'a')).ToString());

            return Regex.Replace(str, "[A-Z]", p => ((char)(p.Value[0] - 'A' + 'A')).ToString());
        }

    }