先日、アプリの実行時に入力した任意のC#ソースコードの値をロギングして、グラフ表示するコントロールを作成しました。
CSharpCodeProviderクラスを使用してC#ソースコードをコンパイルできるのは分かっていましたが、使用するのは初めてです。使い方が分かってしまえば、とても簡単に実装できました。
この実行時コンパイルの機能を利用して、アプリにマクロ機能を実装したり、実行時に任意の処理を注入したり色々と遊べそうです。
先日、アプリの実行時に入力した任意のC#ソースコードの値をロギングして、グラフ表示するコントロールを作成しました。
CSharpCodeProviderクラスを使用してC#ソースコードをコンパイルできるのは分かっていましたが、使用するのは初めてです。使い方が分かってしまえば、とても簡単に実装できました。
この実行時コンパイルの機能を利用して、アプリにマクロ機能を実装したり、実行時に任意の処理を注入したり色々と遊べそうです。
今月も色々と社内画像処理ライブラリに機能追加を行いました。
1.演算に使用する値や論理値を式入力できるようにする。また式で使用できる関数を色々と実装。これにより値操作がとても楽になりました。
2. 配列の作成や連結を行うタスクを追加。
3.画像処理評価ソフトのデザイン変更。今までよりスッキリし、ノートパソコン等の小さい画面でも操作しやすくなりました。
12月頃から開発を進めていた画像案件がもうすぐ一段落します。
今回の装置屋さんはとても優秀で、指示したとおりカメラと照明の微調整が行いやすいように作成してくれました。
おかげで現地調整が効率良く行え、今後の保守も行いやすそうです。
他の装置屋さんもこれくらい良い仕事をしてくれると助かるのですが・・・。
先日、C#スクリプトを試して見ました。
これを使用すればC#プログラムからスクリプトを実行できるようになります。
C#スクリプトの導入方法は他のサイトにも記載されているので置いといて、どのように実装するかだけ。
<実装例>
private int Test(string text) {
var args = new TestArgs { Text = text }; ・・・(1)
var script = CSharpScript.Create(
”Value = Text.Length * 2;” ・・・(2)
, ScriptOptions.Default, typeof(TestArgs));
var scriptState = script.RunAsync(args);
scriptState.Wait();
return args.Value;
}
public class TestArgs {
public int Value { get; set; }
public string Text { get; set; }
}
上記の(2)の個所がC#スクリプトのプログラム部分です。
上記は1行だけですが複数行のプログラムを記載できます。
おこなっている内容も特に意味が無く、Textプロパティの文字数を2倍して、Valueプロパティに代入しているだけです。
この計算結果を呼び出し元のC#側で使用することができます。
(1)でnewしているTestArgsクラスは、C#スクリプトへの入力と出力に使用するクラスで、上記ではTextプロパティを入力に、Valueプロパティを出力に使用しています。
上記の簡単な実装でスクリプトを実行できるのは非常に面白いです。
ですが、実際にどのような用途にこの機能を使うかは悩むところです。
思いつくのは、マクロとして使ったり、動的に演算式や判定条件を変更するなどでしょうか。
スクリプトなので速度はC#で実装するよりも遅いですし、もちろんビルド時に静的コードチェックもされないですし、よく考えて使わないと痛い目に遭うかも知れません。
現在、社内の画像処理ライブラリに測長機能を実装しています。
用途が多そうな機能なのに今まで使う機会が無く、実装していませんでした。
手順やインターフェイスはほぼ決まっており、
基本的にはエッジ検出結果を元に内寸や外寸を計算します。
画像処理機能の追加は久しぶりで、色々と思い出しながら作成しています。
C#のswitchステートメントって不便ですよね。古くさいというか。
戻り値が返せなかったり、複雑な条件が指定できなかったり。
ですので、Switch拡張メソッドを作ってみました。
たとえばint型変数valueの値によって文字列を返す場合、以下のように使用します。
var str = value.Switch()
.Case(0, “0です。”)
.Case(x => x > 0, “プラスです。”)
.Default(“マイナスです。”);
たとえば変数valueの値によって何らかの処理を行う場合、以下のように使用します。
value.Switch()
.Case(0, x => {
//0の場合の処理
}).Case(x => x > 0, x => {
//プラスの場合の処理
}).Default(x => {
//マイナスの場合の処理
});
Switch拡張メソッドはobject型の拡張メソッドになっており、CaseメソッドやDefaultメソッドなどをメンバに持つSwitch処理用のクラスを返すようになっています。
最近のWindwosのエクスプローラは、ファイル名のソート方法が今までと異なっています。
以前は単純にソートしているだけでしたが、最近はファイル名内の数値の個所を数値して認識してソートを行っています。
その結果、連番が付いているファイルなどを自然な順番でソートできています。
このソート方法はナチュラルソートと言われるらしく、ネットで調べると参考ソースコードもいくつか見つかりました。
今後、必要な場面が間違いなく有りそうなので、社内ライブラリに追加したいと考えています。
C#では、継承元で継承先の型を使用することが言語レベルではサポートされていません。これはクローンメソッドなどを作成する場合に不便です。
以下のようにジェネリックを使用することで同等のことが一応行えるようになります。
//継承元クラス
abstract class ClassA<TClass> where TClass : ClassA<TClass>, new() {
public abstract TClass Clone();
}
//継承先クラス
class ClassB : ClassA<ClassB> {
public int Value { get; private set; }
public override ClassB Clone() {
ClassB obj = new ClassB();
obj.Value = Value;
return obj;
}
}
この場合、継承先クラスの型を知るためにTClassを使用しています。TClassの制約にClassA<TClass>が入っているので、ClassA<TClass>を継承したクラスしかTClassに使用できなくなっています。
同等のことが実現できましたが、見た目がシンプルでは無いですね。やはり言語レベルで何とかして欲しいところです。なお、アップルのSwift言語にはこの機能が実装されているそうです。
VISIO2013に続けてProjectも2013に変更しました。
いままではProject2000を使用していました。
Project2000はバグでタスクがうまく動かない場合があったり、Windows7以降のOSでは起動時にヘルプが必ず表示されたりエラーが出たり、何かと不満が多かったのですが、代わりになるソフトが他に無く使い続けていました。
Project2013はそのような問題はなく快適に使用できています。
やはりソフトは新しいほうが良いですね。