イントレ。
Tag for "C#"
Visual Studio 2010 and .NET Framework 4 Release Candidate
ということで英語版が公開されました。
今のところ日本語版の提供予定はないそうです。残念。
最終リリースを延期してまで改善してきたメモリ使用量とパフォーマンスですが、すこぶる良好。
メモリ使用量はそれほど気にはしていなかったのでわかりませんが・・・。
それでも、VS2008と比べると重たいと感じる部分はありますが十分我慢できる範囲です。
これ以上求めるなら、まずはPCスペックを上げないと・・・。
.NET Frameworkの起動速度もかなりマシになっています。
WPFアプリケーションは・・・簡単な計測の結果は初期化に関わる部分(InitializeComponent)の速度が落ちていました。
それでも.NET自体の起動高速化もあってコールドブートでは.NET3.5よりは確実に早いです。
今回のリリースからGo-Liveライセンスが付与されるので、.NET4向けアプリケーションを本格始動させるのもありですね。
今までと違って内部クラスにもかなり手が入っているみたいですし、ClientProfileもかなり使い物になるはず。
System.DataがClientProfileに入ったのでSystem.Data.SQLiteもClientProfileで配布出来ますね。
そういえば、.NET4のMixedMode(混在モード)DLLが読めない件。の記事で載せてたXMLが大文字小文字の違いで無効になってた。
具体的にはuselegacyv2runtimeactivationpolicy → useLegacyV2RuntimeActivationPolicy 。
コードハイライター使わないと大丈夫なのかな?
<configuration>
ということで英語版が公開されました。
今のところ日本語版の提供予定はないそうです。残念。
最終リリースを延期してまで改善してきたメモリ使用量とパフォーマンスですが、すこぶる良好。
メモリ使用量はそれほど気にはしていなかったのでわかりませんが・・・。
それでも、VS2008と比べると重たいと感じる部分はありますが十分我慢できる範囲です。
これ以上求めるなら、まずはPCスペックを上げないと・・・。
.NET Frameworkの起動速度もかなりマシになっています。
WPFアプリケーションは・・・簡単な計測の結果は初期化に関わる部分(InitializeComponent)の速度が落ちていました。
それでも.NET自体の起動高速化もあってコールドブートでは.NET3.5よりは確実に早いです。
今回のリリースからGo-Liveライセンスが付与されるので、.NET4向けアプリケーションを本格始動させるのもありですね。
今までと違って内部クラスにもかなり手が入っているみたいですし、ClientProfileもかなり使い物になるはず。
System.DataがClientProfileに入ったのでSystem.Data.SQLiteもClientProfileで配布出来ますね。
そういえば、.NET4のMixedMode(混在モード)DLLが読めない件。の記事で載せてたXMLが大文字小文字の違いで無効になってた。
具体的にはuselegacyv2runtimeactivationpolicy → useLegacyV2RuntimeActivationPolicy 。
コードハイライター使わないと大丈夫なのかな?
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedruntime version="v4.0" />
</startup>
<supportedruntime version="v4.0" />
</startup>
</configuration>
しっかし、VS2010でMeiryoKe_Consoleが使えなくなったのはチト辛いなぁ。
しっかし、VS2010でMeiryoKe_Consoleが使えなくなったのはチト辛いなぁ。
ユーザー定義関数がかなり有用な予感。
SQL文のRandom()とかSum()とかCount()みたいなのを独自に定義出来る。
System.Data.SQLiteを使うと、ユーザー関数をC#側からも定義出きます。
基本的には以下の流れ。
・SQLiteFunctionを継承したクラスを作成し
・SQLiteFunction属性をつける
・SQLiteFunction.RegisterFunction()で登録
呼ぶときはSQL文に普通に記述すればいい。
たとえば、「SELECT * FROM test ORDER BY value COLLATE NETFX_COLLATE」みたいな。
まずはCollation。
ORDER BY ~ COLLATEに使う文字の比較を定義出きます。
オーバーライドするのはCompare()だけでいいみたい。
[SQLiteFunction(Name="NETFX_COLLATE", FuncType=FunctionType.Collation)]
class NETFX_COLLATE : SQLiteFunction
{
public override int Compare(string param1, string param2)
{
return StringComparer.CurrentCulture.Compare(param1, param2);
}
}
Exolorerの文字ソートみたいに数字を考慮するならStrCmpLogicalW()を使ってこんなことも。
[SQLiteFunction(Name="Logical_COLLATE", FuncType=FunctionType.Collation)]
class Logical_COLLATE : SQLiteFunction
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int StrCmpLogicalW(string str1, string str2);
public override int Compare(string param1, string param2)
{
return StrCmpLogicalW(param1, param2);
}
}
次、Scaler。
Random()とかLower()とかみたいなやつ。
Argumentsには要求する引数の数。-1で可変数にも出来るみたい。
オーバーライドするのはInvoke()メソッド。
[SQLiteFunction(Name="NETFX_RANDOM", FuncType=FunctionType.Scalar, Arguments=0)]
class NETFX_RANDOM : SQLiteFunction
{
readonly static Random rand = new Random();
public override object Invoke(object[] args)
{
return rand.Next();
}
}
最後にAggregate。
Sum()とかCount()みたいに、結果を捜査して出力を返すタイプのもの。
Step()でコンテキストインスタンスを渡して値を保持しておきます。
Step()が必要回数呼ばれて、最後にFinal()が呼ばれます。
[SQLiteFunction(Name = "NETFX_Sum", FuncType = FunctionType.Aggregate, Arguments = 1)]
class NETFX_Sum : SQLiteFunction
{
class Context
{
public decimal Value = 0;
}
public override void Step(object[] args, int stepNumber, ref object contextData)
{
var data = (contextData as Context) ?? (Context)(contextData = new Context());
data.Value += Convert.ToDecimal(args[0]);
}
public override object Final(object contextData)
{
var data = contextData as Context;
return (data == null) ? null : (object)data.Value;
}
}
あーしかしやばいなー。
これは便利すぎる。
SQL文のRandom()とかSum()とかCount()みたいなのを独自に定義出来る。
System.Data.SQLiteを使うと、ユーザー関数をC#側からも定義出きます。
基本的には以下の流れ。
・SQLiteFunctionを継承したクラスを作成し
・SQLiteFunction属性をつける
・SQLiteFunction.RegisterFunction()で登録
呼ぶときはSQL文に普通に記述すればいい。
たとえば、「SELECT * FROM test ORDER BY value COLLATE NETFX_COLLATE」みたいな。
まずはCollation。
ORDER BY ~ COLLATEに使う文字の比較を定義出きます。
オーバーライドするのはCompare()だけでいいみたい。
[SQLiteFunction(Name="NETFX_COLLATE", FuncType=FunctionType.Collation)]
class NETFX_COLLATE : SQLiteFunction
{
public override int Compare(string param1, string param2)
{
return StringComparer.CurrentCulture.Compare(param1, param2);
}
}
Exolorerの文字ソートみたいに数字を考慮するならStrCmpLogicalW()を使ってこんなことも。
[SQLiteFunction(Name="Logical_COLLATE", FuncType=FunctionType.Collation)]
class Logical_COLLATE : SQLiteFunction
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern int StrCmpLogicalW(string str1, string str2);
public override int Compare(string param1, string param2)
{
return StrCmpLogicalW(param1, param2);
}
}
次、Scaler。
Random()とかLower()とかみたいなやつ。
Argumentsには要求する引数の数。-1で可変数にも出来るみたい。
オーバーライドするのはInvoke()メソッド。
[SQLiteFunction(Name="NETFX_RANDOM", FuncType=FunctionType.Scalar, Arguments=0)]
class NETFX_RANDOM : SQLiteFunction
{
readonly static Random rand = new Random();
public override object Invoke(object[] args)
{
return rand.Next();
}
}
最後にAggregate。
Sum()とかCount()みたいに、結果を捜査して出力を返すタイプのもの。
Step()でコンテキストインスタンスを渡して値を保持しておきます。
Step()が必要回数呼ばれて、最後にFinal()が呼ばれます。
[SQLiteFunction(Name = "NETFX_Sum", FuncType = FunctionType.Aggregate, Arguments = 1)]
class NETFX_Sum : SQLiteFunction
{
class Context
{
public decimal Value = 0;
}
public override void Step(object[] args, int stepNumber, ref object contextData)
{
var data = (contextData as Context) ?? (Context)(contextData = new Context());
data.Value += Convert.ToDecimal(args[0]);
}
public override object Final(object contextData)
{
var data = contextData as Context;
return (data == null) ? null : (object)data.Value;
}
}
あーしかしやばいなー。
これは便利すぎる。
更新するネタが無いので。(汗)
◇SQLiteConnectionStringBuilder
接続文字列の自動生成。
プロパティ設定してToString()で取得できる。
◇SQLiteDataAdapter
DataSet/DataTableとのやり取りに使用。
最低限、Select文を渡して置く必要がある。SELECT * FROM hoge みたいな。
Fill()でDB読み込み、Update()でDB更新。
◇SQLiteCommandBuilder
UPDATE/INSERT/DELETE文の自動生成。
SELECT文設定済みのDataAdapterが必要。
◇読むとき
var conn = new SQLiteConnection(...);
var da = new SQLiteDataAdapter(...);
var ds = new DataSet();
da.Fill(ds, "hoge");
◇書くとき
var conn = new SQLiteConnection(...);
conn.Open();
var ts = conn.BeginTransaction();
var da = new SQLiteDataAdapter(...);
var cb = new SQLiteCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.InsertCommand = cb.GetInsertCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.Update(table);
ts.Commit();
◇LINQ
// System.Data.DataSetExtensions.dllの参照が必要
new DataTable(...)
.AsEnumerable()
.Where(row => row.Field("column1") == "hoge")
.Select(row => row);
こんなことせずに素直にEntityFramework使う方が賢い気はするけど、敢えて。
◇SQLiteConnectionStringBuilder
接続文字列の自動生成。
プロパティ設定してToString()で取得できる。
◇SQLiteDataAdapter
DataSet/DataTableとのやり取りに使用。
最低限、Select文を渡して置く必要がある。SELECT * FROM hoge みたいな。
Fill()でDB読み込み、Update()でDB更新。
◇SQLiteCommandBuilder
UPDATE/INSERT/DELETE文の自動生成。
SELECT文設定済みのDataAdapterが必要。
◇読むとき
var conn = new SQLiteConnection(...);
var da = new SQLiteDataAdapter(...);
var ds = new DataSet();
da.Fill(ds, "hoge");
◇書くとき
var conn = new SQLiteConnection(...);
conn.Open();
var ts = conn.BeginTransaction();
var da = new SQLiteDataAdapter(...);
var cb = new SQLiteCommandBuilder(da);
da.UpdateCommand = cb.GetUpdateCommand();
da.InsertCommand = cb.GetInsertCommand();
da.DeleteCommand = cb.GetDeleteCommand();
da.Update(table);
ts.Commit();
◇LINQ
// System.Data.DataSetExtensions.dllの参照が必要
new DataTable(...)
.AsEnumerable()
.Where(row => row.Field
.Select(row => row);
こんなことせずに素直にEntityFramework使う方が賢い気はするけど、敢えて。
Silverlight 4 Betaがリリースされてからいろいろいじってます。
反則過ぎると思ったOut-of-Browserの信頼実行モードなんですが、
ちゃんと制限がしかれてあって、自由自在とはいかないご様子。
たとえば、ローカルファイルへのアクセスが出来るようにはなりましたが、
「マイ ドキュメント」「マイ ミュージック」「マイ ビデオ」「マイ ピクチャ」の4カ所に限定されています。
(その他、FileOpenDialog等でユーザーが指定したファイルにアクセス可能なのは変わらず)
しかし、それ故の安全さもあるので、場合によっちゃ都合がいいかもしれない。
設定保存とかインストール、アップデートの方法も限られてる分わかりやすいし。
アプリ配布パッケージとしてxapというのも悪くはないかもしれんね。
で、OOBの信頼実行モードの設定なんですが、
通常はプロジェクトのプロパティから、Out-of-Browser Settings
VWD→SilverlightTools→VS2010日本語版という順番で入れたせいか、設定項目が見えません。

左:英語版(動画から拝借) / 右:VS2010日本語版
とりあえず、OOBの設定はProperties\OutOfBrowserSettings.xmlに書いてあるので、
直接編集しちゃえばいいと思います。
それにしても、VS2010の不安定っぷりはまだまだですね・・・。
特にデバッグしてプロセス殺したときと、WPF/Silverlightのデザイナを開いたり閉じたりしたとき。
フリーズしてビジー状態ですって怒られてなんにも出来なくなっちゃう。
Beta1の時に比べればかなりましになったし、コードを編集中ならまずフリーズはしないんだけど。
XAMLガリガリ編集した後に保存される前にフリーズすると泣けてくる。
反則過ぎると思ったOut-of-Browserの信頼実行モードなんですが、
ちゃんと制限がしかれてあって、自由自在とはいかないご様子。
たとえば、ローカルファイルへのアクセスが出来るようにはなりましたが、
「マイ ドキュメント」「マイ ミュージック」「マイ ビデオ」「マイ ピクチャ」の4カ所に限定されています。
(その他、FileOpenDialog等でユーザーが指定したファイルにアクセス可能なのは変わらず)
しかし、それ故の安全さもあるので、場合によっちゃ都合がいいかもしれない。
設定保存とかインストール、アップデートの方法も限られてる分わかりやすいし。
アプリ配布パッケージとしてxapというのも悪くはないかもしれんね。
で、OOBの信頼実行モードの設定なんですが、
通常はプロジェクトのプロパティから、Out-of-Browser Settings
VWD→SilverlightTools→VS2010日本語版という順番で入れたせいか、設定項目が見えません。

左:英語版(動画から拝借) / 右:VS2010日本語版
とりあえず、OOBの設定はProperties\OutOfBrowserSettings.xmlに書いてあるので、
直接編集しちゃえばいいと思います。
それにしても、VS2010の不安定っぷりはまだまだですね・・・。
特にデバッグしてプロセス殺したときと、WPF/Silverlightのデザイナを開いたり閉じたりしたとき。
フリーズしてビジー状態ですって怒られてなんにも出来なくなっちゃう。
Beta1の時に比べればかなりましになったし、コードを編集中ならまずフリーズはしないんだけど。
XAMLガリガリ編集した後に保存される前にフリーズすると泣けてくる。
こいつ動くぞ
「var s = 1 + "a" + true;」 が 正常にコンパイル通って "1aTrue" になるそうで。
実際に試してみると確かにそうなるんだけど、なんか納得いかないのでMSDNを見てみた。
+ 演算子 (C# リファレンス)
> 二項 + 演算子は、数値型と文字列型に対してあらかじめ定義されています。
> 数値型の場合、+ は 2 つのオペランドの合計を計算します。
> オペランドの片方または両方が文字列型の場合は、オペランドの文字列表現が連結されます。
今までstring.Format()とか、ToString()コンボしてたのがバカみたい orz
「var s = 1 + "a" + true;」 が 正常にコンパイル通って "1aTrue" になるそうで。
実際に試してみると確かにそうなるんだけど、なんか納得いかないのでMSDNを見てみた。
+ 演算子 (C# リファレンス)
> 二項 + 演算子は、数値型と文字列型に対してあらかじめ定義されています。
> 数値型の場合、+ は 2 つのオペランドの合計を計算します。
> オペランドの片方または両方が文字列型の場合は、オペランドの文字列表現が連結されます。
今までstring.Format()とか、ToString()コンボしてたのがバカみたい orz
Utilities
- タグ
- カレンダー
- 最近の更新
- [日記] TortoiseHg 1.0
- [日記] サマーウォーズ
- [日記] .NET4→.NET3.5のコード互換性とか。
- [日記] SubversionからMercurialへ。
- [日記] 第4回MMD杯
- [日記] VS2010RC一般公開。
- [日記] ソニック4・・・だと?!
2010-03-102010-03-052010-03-012010-02-212010-02-162010-02-112010-02-07
- Adsense