CustomScript

ページ

ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2016年6月29日水曜日

UNICODEファイル名に対応していないDLLでファイルアクセスを可能にする方法

  • C#
久々に技術系メモです。

古いDLLは"♥"とかのユニコード文字が使われているファイルにアクセスできないことがあります。
幸いなことにWindowsのファイルは8.3形式の別名のファイル名(ショートファイル名)を持っており、その名前でアクセスすればうまくいく可能性があります。

サンプルコードは以下のようになります。.Net にはショートファイル名を取得する機能がないので、Win32APIを使用して取得します。
NeeViewではこの方法でSusieプラグインでのユニコードファイル名アクセスを実現しています。

2016年4月18日月曜日

VisualStudio 2015 Update2 のメモ

  • VisualStudio2015
  • WPF
  • C#
久々に技術ネタを投稿。

VisualStudio 2015 Update2 がきていました。
詳細はこちら。

Visual Studio 2015 Update 2
https://www.visualstudio.com/news/vs2015-update2-vs

Visual Studio 2015 Update 2 リリース
https://blogs.msdn.microsoft.com/visualstudio_jpn/2016/03/31/visual-studio-2015-update-2-rtm/

C/C++パフォーマンスが改善されてたり、Git LFS対応とかいろいろありますが、その中で自分に関係しそうなWPFとC#に関連する変更点のみ挙げてみます。


C#インタプリタ


C#インタプリタを気軽に試せるようになりました。
「対話形式で実行(Ctrl+E,Ctrl+E)」 で C#インタラクティブウィンドウが開きます。
手前に開かないのでわかりにくいですが、ドキュメントのタブに[C# Interactive]が増えてると思います。
コンソールになっているので、以下のようにC#命令を直接入力実行できます。

> Console.WriteLine("Hello!")
Hello!

ソースコードのコードを選択してからCtrl+E,Ctrl+Eすると、そのコードをC#インタラクティブウィンドウ上で実行できるので、ちょっとしたチェックに使用できる、かな?

「#help」 で操作方法が表示されますが、それを見るとdllの読み込みやスクリプトの実行ができるようです。

・・といった感じですが、有用な活用方法が私には今のところなさげです。


コード修正機能がより便利になった -- Typo修正


コード上に現れる電球マークを押すとusing宣言を挿入したりインターフェイスの雛形を挿入してくれる便利な機能があるのですが、多少打ち間違えた場合でも正しいクラス名とかに修正してくれるようになりました。

例えば、
Straem
のようなtypoを
Stream
になおしてくれる、といった感じです。

試してみたのですが、修正が効かない場合があったり期待とは異なる修正を提案したりするので、過剰な期待はしないほうが良いでしょう。

ちなみに例で上げたようなtypoは Ctrl+t で前後の文字入れ替えるという機能を使って修正することができます。

コード修正機能がより便利になった -- null条件演算子へ変換、等


これもコード修正機能です。
if (action != null) action();
といったコードを
action?.Invoke();
のようなnull条件演算子を使用した修正を提案するようになりました。

他にも、awaitを使用してないasync関数からasyncを削除する修正を提案したりするようです。


C#アナライザのパフォーマンス向上


C# Analyzer および Visual Basic Analyzer の API が改良され、生成されたコードでアナライザーを実行するときのパフォーマンスと制御性が向上した、ようです。

使ってないのでよくわからないっす。


アプリ内のUIデバッグメニュー


WPFのプロジェクトをデバッグ実行すればすぐわかると思うのですが、アプリのタイトルバー直下にXAMLデバッグ用のUIメニューが表示されるようになりました。今までライブビジュアルツリーにあった機能ですが、それがより使いやすくなった感じでしょうか。


これを表示したくない場合は、[デバッグ(D)]>[オプション(O)] で「デバッグ>全般」の「アプリケーションでランタイムツールを表示」のチェックを外します。

あと、XAMLデバッグ関係ではライブプロパティエディタにアクセシビリティプロパティ(AutomationPeer)が表示されるようになったようです。うん、よくわからん。

これらのXAMLデバッグ機能については以下の動画(英語)を見るとなんとなくわかります。

Runtime Editing Tools for XAML
https://www.youtube.com/watch?v=Ama_giXPtvE



このムービーでは実行中にXAML編集していますが、これはUpdate2ではなく次期VisualStudioの新機能(現在プレビュー版)です

2015年12月24日木曜日

MSBuildでWPFプロジェクトをビルドする

  • VisualStudio 2015
  • C# 6.0

バッチファイルは以下の様になります。
set MSBUILD="C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe"
set SOLUTION="C:\Documents\Visual Studio 2015\Projects\MyProject\MyProject.sln"

%MSBUILD% %SOLUTION% /p:Configuration=Release /t:Clean,Build
MSBuild.exe のパスに気をつけてください。
Windowsにはいくつもの MSBuild.exe がインストールされていますが、 上記パスの MSBuild.exe を使用しないと C# 6.0 の新しい構文でエラーになります。

参考URL
http://stackoverflow.com/questions/32007871/how-to-upgrade-msbuild-to-c-sharp-6

2015年12月21日月曜日

WPF勉強(12) ComboBoxとEnum

  • WPF
  • .NET 4.5
  • C# 6.0
enumをComboBoxで使う方法です。
2パターンの実装サンプルを紹介します。

Enum名で選択する

ComboBox で選択させるためにはとにかく選択項目のリストが必要です。
Enum.GetValues() で Enum のリストを作成し、それを ItemSource としてバインドします。

対応する文字列で選択する

Enumと文字列がペアになったリストを使います。今回は Dictionary 型を使用した例になります。
Dictionary を作成し、それを ItemSource としてバインドします。 SelectedValuePath で選択されるプロパティ名、 DisplayMemberPath で表示するプロパティ名を指定します。 今回の場合は Dictionary 型なので "Key" と "Value" になります。

サンプルコード


2015年11月4日水曜日

[C#] Processの標準出力が文字化けする時の対処

  • C#
  • .Net 4.5
外部コマンドを実行するには System.Diagnostics.Process を使うのですが、その標準出力を StandardOutput.ReadToEnd() でリダイレクトすると文字化けしてしまう時があります。そんな時は StartInfo.StandardOutputEncoding に標準出力の文字コードを設定します。
// サンプル
using (var process = new System.Diagnostics.Process())
{
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;

    process.StartInfo.RedirectStandardOutput = true; // 標準出力リダイレクトON
    process.StartInfo.StandardOutputEncoding = Encoding.UTF8; // エンコーディング設定

    process.StartInfo.FileName = ... ;
    process.StartInfo.Arguments = ... ;

    process.Start();

    process.WaitForExit();

    string text = process.StandardOutput.ReadToEnd(); // 標準出力を得る
    :
}

2014年12月10日水曜日

[C#] ループする範囲に値を正規化する

  • C#
0から360でループする角度のように、任意のループする範囲に値を正規化する関数を作ってみました。
C#で浮動小数の%演算がいい働きしてくれています。

【MSDN】% 演算子 (C# リファレンス)
http://msdn.microsoft.com/ja-jp/library/0w4e0fzs.aspx

float NormalizeLoopRange(float val, float min, float max)
{
    if (min >= max) throw new System.ArgumentException("need min < max");

    if (val >= max)
    {
        return min + (val - min) % (max - min);
    }
    else if (val < min)
    {
        return max - (min - val) % (max - min);
    }
    else
    {
        return val;
    }
}
あまり動作検証していませんのでバグがあったらすみません。

2014年11月27日木曜日

WPF勉強(5) async/awaitと例外処理

  • VS2013
重いコンバート処理などでウィンドウが固まるのを回避するために非同期処理を実装します。
で、async/awaitを使ってみたのですが、例外のキャッチが上手く行かなかったのでいろいろ試してみました。

        // Button1 Click Event
        private async void Button1_Click(object sender, RoutedEventArgs e)
        {
            this.Button1.IsEnabled = false;

            try
            {
                for (int i = 0; i < 10; i++)
                {
                    this.TextBox1.AppendText(i + "\n");
        #if true
                    // 非同期になるし、例外キャッチできる
                    await Task.Run(async () => HeavyProcess(i));
                    // コンパイラ警告が気になる場合は適当なawaitを追加
                    //await Task.Run(async () => {HeavyProcess(i); await Task.Yield();});
        #else
                    // 非同期になるが、例外キャッチできない
                    await Task.Run(() => HeavyProcess(i));
        #endif
                }
            }
            catch (Exception ex)
            {
                this.TextBox1.AppendText(ex.Message);
            }

            this.Button1.IsEnabled = true;
        }

        // Heavy Process
        void HeavyProcess(int count)
        {
            System.Threading.Thread.Sleep(1000);
            if (count >= 5) throw new ApplicationException("例外発生!!");
        }

非同期タスクをちゃんとasyncにしないとダメらしい。

正直よくわかってないので、間違いの指摘お願いします。



(2017-07-27 追記)

これはデバッグモード特有の挙動で、asyncにしなくても問題ないようです。
http://qiita.com/habu1010/items/08177698fa3826474c0b

VS2017だとデバッグでもちゃんと例外取得できてますね。