Knowlbo 開発者ブログ

株式会社Knowlboの開発者ブログです。

C# REPL とスクリプト

開発部の本橋です。

Visual Studio 2015 Update 1 より csi.exe なるものが付いてくるようになりました。これは C# の REPL であり、スクリプトインタープリターのようです。ちょっと使ってみました。

REPL

スタートメニューより 開発者コマンドプロンプト for VS2015 を実行すると csi.exe のあるフォルダにパスが通っています。私の環境では以下の場所にありました。

> where csi
C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe

csi.exe を実行するとインタープリターと対話できます。

> csi
Microsoft (R) Visual C# インタラクティブ コンパイラ バージョン 1.2.0.60317
Copyright (C) Microsoft Corporation. All rights reserved.

詳細については、「#help」と入力します。
>

ここからはいつも通り C# のコードが書けます。関数や try ステートメントもいけますね。

> private int AddOne(int i)
. {
.     return i + 1;
. }
> AddOne(5)
6
>
> try {
.     throw new Exception("an error");
. }
. catch (Exception ex) {
.     Console.WriteLine(ex.Message);
.     Console.WriteLine("--------------------");
.     Console.WriteLine(ex.StackTrace);
. }
an error
--------------------
   場所 Submission#12.<<Initialize>>d__0.MoveNext()
>

スクリプト

C# スクリプトは拡張子 .csx とします。まずは簡単なファイルを用意します。

// test1.csx
using System;

private DateTime AddOneHour(DateTime dt)
{
    return dt.AddHours(1);
}

Console.WriteLine("Hello csi.");
Console.WriteLine("--------------------");
Console.WriteLine(AddOneHour(DateTime.Now))

スクリプトの実行は csi.exe にファイル名を渡してあげます。

> csi test1.csx
Hello csi.
--------------------
2017/01/17 19:04:48

クラス定義や MessageBox もいけますね。

// test2.csx
// アセンブリの参照は #r で始める
#r "System.Windows.Forms"

using System;
using System.Windows.Forms;

// メッセージボックスもいける
MessageBox.Show("Hello csi.");

// クラスもいける
public class MyClass
{
    public DateTime AddOneDay(DateTime dt)
    {
        return dt.AddDays(1);
    } 
}
MyClass myClass = new MyClass();
Console.WriteLine(myClass.AddOneDay(DateTime.Now));
> csi test2.csx
2017/01/18 18:08:44

f:id:knowlbodev:20170117181103p:plain

使いどころ

現在のところ Visual Studio に付属しているプログラムなので本番環境で利用することは難しいと思いますが、開発時にちょっとした確認が手軽にできるのは良いですね。 (「この数字、16進数だと何だっけ?」とか・・・ありますよね)

> 123.ToString("X")
"7B"

more

今回は csi.exe の本当にシンプルな使い方を試してみました。より深く知るにはこちらのページなどが足がかりになりそうです。

Essential .NET - C# スクリプト

構成ファイル(config)へアクセスする際のパフォーマンス

開発部の緒方です。本日は開発メモです。

アプリケーションは、構成ファイル(config)で設定を変更できるようにします。
構成ファイルへのアクセスは当然ファイルI/Oが発生するため、都度読み込むとパフォーマンスが悪くなります。

そのため、起動時や最初のアクセス時に構成ファイルの内容をキャッシュするのが常套手段なのですが、.Net Frameworkの標準的な下記のクラス、メソッドを利用すると、この処理を自動で行ってくれます。

System.Configuration.ConfigurationManager.AppSettings

このクラス、メソッドを利用していれば、パフォーマンスの心配をする必要はありません。
もちろん、マルチスレッド対応です。

フレームワークらしい、素晴らしい実装ですね。

ドメインアカウントで Windows にログインできなくなった時にやること

開発部の本橋です。 今回は社内情シス的な Tips です。

ドメインアカウントで突然 Windows にログインできなくなる

ドメインに参加しているPCにログインしようとすると以下のようなメッセージが表示されログインできなくなってしまうことがあります。

このワークステーションとプライマリドメインとの信頼関係に失敗しました

滅多に遭遇することはないんですが、アカウントのパスワードを変更した直後に起こりやすいような気がします。

Microsoft 公式の KB2771040 にもあるように、一旦ドメインから抜けてもう一度参加しなおせば良いのですが、管理者グループに入ったローカルアカウントがないとできません。

キャッシュされた資格情報を利用する

スタンドアロンの Windows はキャッシュされた資格情報を利用してログインできますので*1、この仕組みを利用して復旧します。

  1. LANケーブルを抜く。
  2. ドメインのアカウント名とパスワードを入力する。
    • この時、パスワードを変更した直後の場合は変更前のパスワードを入力する。
  3. ローカルアカウントを作成し、管理者グループに追加する。
    • またはローカル administrator を有効化する。
  4. 一度ログアウトし、作成したローカルアカウントでログインする。
  5. ドメインから抜ける。
  6. LANケーブルを繋ぐ。
  7. ドメインにもう一度参加する。

これで通常通りドメインアカウントでPCにログイン出来るようになります。

*1:これを無効にしている場合はお手上げですが・・・