- .NETアプリの起動を早くする [#g83c0fe0]
クライアントでngen.exeを実行すれば、アセンブリがキャッシュされて起動が早くなるとのこと。 しかし、上記ページの下の方にあるように、アセンブリのバージョンがあがったり、 .NET Frameworkのバージョンがあがったり、CPUが変わったりすると、再度同じ作業が必要になるみたい。 .NET FrameworkがCPUによってネイティブコードを最適化しているからでしょうね。 インストーラーやアップデートツールなどで自動で実行させるような形になるのでしょうね。 ちなみに、アプリケーションドメインが使えなくなるので、用途によってはこのツールは使えないみたい。
- NDocでPrivateなメソッドも出力する [#e0324db9]
DocumentPrivatesをTrueにして出力するとよい
- TextBoxコントロールでUndo処理 [#y79c8721]
単純にTextBoxのUndoメソッドやClearUndoを呼び出せば良いらしい
- クラス名を大括弧で囲む理由 [#acea1e72]
大括弧[]で囲むと、それはクラス名として認識されるっぽい。 例えばAssemblyとかはフォームのプロパティーにもあるので、[]で囲んでクラス名だということを明らかにしないといけない(みたい)
- たとえばプラグイン機能を追加したい場合・・ [#w4e15b4e]
以下にプラグイン形式のプログラムを作る時を例に説明がある -http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_09/idnfw11_09_04.html
たとえば、プラグインロード時に「このプラグインはネットワークへの接続を行います。よろしいですか?」といった確認を表示し、「はい」を押せば許可を与えて動かすことができるようにはできるのだろうか?
上記のページの例では基底クラスの属性に
[FileIOPermissionAttribute
(SecurityAction.InheritanceDemand, Read="C:\\")]
(これはファイルアクセスのセキュリティー)
を与えるようになっているので、フレキシブルな対応はできなさそう。 何か方法があるのか?
http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_09/idnfw11_09_05.html のDemandの動作を変更する(Deny、PermitOnly)がそうかな?
- パラメータ カウントが一致しません [#a322ac44]
BeginInvokeやらを触って、Windowsフォームで非同期処理を書いていたら、実行時に以下のようなエラーが発生。
System.Reflection.TargetParameterCountException: パラメータ カウントが一致しません。
at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess)
at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean verifyAccess)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.MulticastDelegate.DynamicInvokeImpl(Object[] args)
at System.Delegate.DynamicInvoke(Object[] args)
at System.Windows.Forms.Control.InvokeMarshaledCallbacks()
どうも、BeginInvokeで呼び出すメソッド(この例ではfrmMain.Complete)に引数が必要なのに、それを入れるのを忘れていたからエラーになったようだ。
CompleteDelegate comp = new CompleteDelegate(((frmMain)control).Complete);
object [] args = { doneEvent };
IAsyncResult ar = control.BeginInvoke(comp,args);
これを、
CompleteDelegate comp = new CompleteDelegate(((frmMain)control).Complete);
IAsyncResult ar = control.BeginInvoke(comp);
としていた。
どこかのアセンブリに入っているクラスのインスタンスを、名前で指定してインスタンス化する方法。
//アセンブリファイルからAssemblyクラスを作成
System.Reflection.Assembly asm
= System.Reflection.Assembly.LoadFrom("WindowsApplication1.exe");
//型を取得
Type typ = asm.GetType("WindowsApplication1.GreetingMessageGetter");
//インスタンス化
Object obj = Activator.CreateInstance(typ);
//インスタンスはIValueGetterを実装している前提
IValueGetter hoge = (IValueGetter)obj;
MessageBox.Show(hoge.GetValue());
この例は WindowsApplication.exe の、IValueGetter を実装するクラス GreetingMessageGetter を生成している。 LoadFromはアセンブリファイルのパス。GetTypeの引数は生成するクラス名。 これらの文字列をXMLなどで読み込むようにすれば、設定ファイルの変更のみで動作を変えることが出来るようになる。