いつからかわかりませんが、Visual C#のデバッグが終了するのが異常におそく、デバッグするのが億劫になっていました。
会社ではこんなこと無いので、ちょっと調べてみると、
[ツール]→[オプション]→[環境]→コンテンツをダウンロードする間隔(D)をオフにするとOK。的な情報を見つけました。で設定変更してみるとすいーっと終わるようになります。チョー快適。
「ファイル更新後の保存時 (Ctrl+Sなど) にCPU使用率が最大となり、しばらく操作不能となる 」とか「Visual Studio 2008でデバッグ終了後、編集可能になるまでに時間がかかる場合は?」に詳細が記載されています。
GDDとは「Gut's Driven Development」の略です。簡単にいうとガッツ駆動方式のシステム開発です。
えぇまぁ、私の開発スタイルです。このBlogでは、そんなシステム開発の作業で発見したことを記録していきます。
(Google Developer Daysとはなんの関係ありません。)
2010年1月27日水曜日
2010年1月26日火曜日
[TOOL]Spy++っぽいツール
先日、Visual Studioに付属のSpy++が使いたい用件がありました。しかし、ライセンスの都合上ExpressEditionを使っていたため、Spy++が付属していません。
途方にくれていると、UISpyなるツールがWindowsSDKに付いているとの情報をキャッチ。SDKはインストール済みなので、早速インストールフォルダを確認してみると、それらしいツールはありませんでした。
で、情報を探してみると、SDKでも↓のバージョンじゃないと入っていないらしいとのこと。
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
現在、確認中。
途方にくれていると、UISpyなるツールがWindowsSDKに付いているとの情報をキャッチ。SDKはインストール済みなので、早速インストールフォルダを確認してみると、それらしいツールはありませんでした。
で、情報を探してみると、SDKでも↓のバージョンじゃないと入っていないらしいとのこと。
Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1
現在、確認中。
2010年1月22日金曜日
[ASP.NET]状態管理に関する推奨事項
ASP.NETでは状態管理のしかたとしてApplication > Session > Requestの順で、広いスコープでデータを管理します。それ以外に、Cookieがあります。でそれらの使い分けについて、まとめられているページを見つけました。備忘録としてメモ。「ASP.NET の状態管理に関する推奨事項」
2010年1月15日金曜日
[.NET]シャローコピーとディープコピー
objectクラスにはMemberwiseCloneというメンバ変数をコピーしてくれるメソッドが標準で搭載されています。しかし、このメソッドはシャローコピーなので、内包しているクラスがある場合、そのオブジェクトをコピーしません。
で、コレを解決するにはディープコピーするしかないのですが、コレを簡単にやる方法としてシリアライズする方法があります。意外と簡単。コードはこんな感じ。
//using System.IO;
//using System.Runtime.Serialization.Formatters.Binary;
private void button1_Click(object sender, EventArgs e)
{
CopyTest test1 = new CopyTest();
System.Diagnostics.Debug.WriteLine(test1);
//『IntData=[1] ,StringData=[1], modeText[葉]』と表示される
test1.SetChild();
// インスタンスをコピーする
CopyTest test2 = test1.Clone();
CopyTest test3 = (CopyTest)Clone(test1);
System.Diagnostics.Debug.WriteLine(test1);
System.Diagnostics.Debug.WriteLine(test2);
System.Diagnostics.Debug.WriteLine(test3);
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
// Childのインスタンスがシャローコピーなので、test1/test2のIntDataが同じ値になる
test2.Child.IntData = 3;
System.Diagnostics.Debug.WriteLine(test1);
System.Diagnostics.Debug.WriteLine(test2);
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[3] ,StringData=[1], modeText[葉]}』と表示される
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[3] ,StringData=[1], modeText[葉]}』と表示される
// test3はディープコピーになるので、IntDataは1のまま
System.Diagnostics.Debug.WriteLine(test3);
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
}
private static object Clone(object obj)
{
object result = null;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
result = bf.Deserialize(ms);
}
return result;
}
[Serializable()]
public class CopyTest
{
public int IntData { get; set; }
public string StringData { get; set; }
private string modeText = "葉";
public CopyTest Child { get; set; }
public CopyTest()
{
IntData = 1;
StringData = "1";
}
public void SetChild()
{
modeText = "枝";
Child = new CopyTest();
}
public override string ToString()
{
string result = "IntData=[" + IntData + "] ,StringData=[" + StringData + "], modeText[" + modeText + "]";
if (Child != null)
{
result += "{" + Child.ToString() + "}";
}
return result;
}
public CopyTest Clone()
{
return (CopyTest)MemberwiseClone();
}
}
で、コレを解決するにはディープコピーするしかないのですが、コレを簡単にやる方法としてシリアライズする方法があります。意外と簡単。コードはこんな感じ。
//using System.IO;
//using System.Runtime.Serialization.Formatters.Binary;
private void button1_Click(object sender, EventArgs e)
{
CopyTest test1 = new CopyTest();
System.Diagnostics.Debug.WriteLine(test1);
//『IntData=[1] ,StringData=[1], modeText[葉]』と表示される
test1.SetChild();
// インスタンスをコピーする
CopyTest test2 = test1.Clone();
CopyTest test3 = (CopyTest)Clone(test1);
System.Diagnostics.Debug.WriteLine(test1);
System.Diagnostics.Debug.WriteLine(test2);
System.Diagnostics.Debug.WriteLine(test3);
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
// Childのインスタンスがシャローコピーなので、test1/test2のIntDataが同じ値になる
test2.Child.IntData = 3;
System.Diagnostics.Debug.WriteLine(test1);
System.Diagnostics.Debug.WriteLine(test2);
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[3] ,StringData=[1], modeText[葉]}』と表示される
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[3] ,StringData=[1], modeText[葉]}』と表示される
// test3はディープコピーになるので、IntDataは1のまま
System.Diagnostics.Debug.WriteLine(test3);
//『IntData=[1] ,StringData=[1], modeText[枝]{IntData=[1] ,StringData=[1], modeText[葉]}』と表示される
}
private static object Clone(object obj)
{
object result = null;
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
result = bf.Deserialize(ms);
}
return result;
}
[Serializable()]
public class CopyTest
{
public int IntData { get; set; }
public string StringData { get; set; }
private string modeText = "葉";
public CopyTest Child { get; set; }
public CopyTest()
{
IntData = 1;
StringData = "1";
}
public void SetChild()
{
modeText = "枝";
Child = new CopyTest();
}
public override string ToString()
{
string result = "IntData=[" + IntData + "] ,StringData=[" + StringData + "], modeText[" + modeText + "]";
if (Child != null)
{
result += "{" + Child.ToString() + "}";
}
return result;
}
public CopyTest Clone()
{
return (CopyTest)MemberwiseClone();
}
}
2010年1月12日火曜日
[.NET]スレッドに引数を渡す
スレッドを生成する場合、.NET 1.1系では引数を使うことができず、SetDataメソッドで対応していましたが、.NET2.0以降ではParameterizedThreadStart デリゲートを使うことにより、実現できるようです。
しかしThread.Startにも引数付きのものが用意されています。どう違うのかMSDNのサンプルからはいまいち読み取れない。。。
しかしThread.Startにも引数付きのものが用意されています。どう違うのかMSDNのサンプルからはいまいち読み取れない。。。
2010年1月5日火曜日
[.NET]コンソールアプリでコンソールを消す
.NETでコンソールアプリを作ると、通常、コンソールを消すことができません。が、p/involeを使うことにより、消すことができます。コードはこんな感じ。なのですが、エクスプローラからダブルクリックすると一瞬コンソールが表示されてしまいます。
で、完全に消すと方法としては、WindowsFormアプリにしておいて、Formを表示しないという技がありますが、なんとなく違和感がありますね。
class Program
{
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool FreeConsole();
static void Main(string[] args)
{
FreeConsole();
Thread.Sleep(5000);
}
}
{
[DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
static extern bool FreeConsole();
static void Main(string[] args)
{
FreeConsole();
Thread.Sleep(5000);
}
}
で、完全に消すと方法としては、WindowsFormアプリにしておいて、Formを表示しないという技がありますが、なんとなく違和感がありますね。
2010年1月1日金曜日
[.NET]プライベートコンストラクタのクラスを強引にインスタンス化する
privateコンストラクタしかないクラスや都合によりprivateコンストラクタからインスタンス化したい場合、Activator.CreateInstanceでは、MissingMethodExceptionが発生してしまいます。
こういう場合、Typeからコンストラクタを取り出し、そこからインスタンス化します。コードはこんな感じ。
こういう場合、Typeからコンストラクタを取り出し、そこからインスタンス化します。コードはこんな感じ。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//using System.Reflection;
MethodBase.GetCurrentMethod();
}
private void button1_Click(object sender, EventArgs e)
{
Type tp = typeof(PrivateConst);
ConstructorInfo ci = tp.GetConstructors(BindingFlags.NonPublic| BindingFlags.Instance)[0];
object obj = ci.Invoke(new object[] { });
System.Diagnostics.Debug.WriteLine("Type=" + obj.GetType());
//「Type=WindowsFormsApplication1.PrivateConst」と表示された
}
}
class PrivateConst
{
private PrivateConst()
{
}
}
}
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//using System.Reflection;
MethodBase.GetCurrentMethod();
}
private void button1_Click(object sender, EventArgs e)
{
Type tp = typeof(PrivateConst);
ConstructorInfo ci = tp.GetConstructors(BindingFlags.NonPublic| BindingFlags.Instance)[0];
object obj = ci.Invoke(new object[] { });
System.Diagnostics.Debug.WriteLine("Type=" + obj.GetType());
//「Type=WindowsFormsApplication1.PrivateConst」と表示された
}
}
class PrivateConst
{
private PrivateConst()
{
}
}
}
登録:
投稿 (Atom)