→C#関連
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。 他のメモリが壊れていることが考えられます。
System.Environment.MachineName
開発時に、グローバル アセンブリ キャッシュにアセンブリを繰り返し配置する代わりに、 アセンブリのビルド出力ディレクトリを指す DEVPATH 環境変数を作成できます。
class ProfTime
{
bool bInProf = false;
long m_start;
long m_end;
public void Start()
{
Debug.Assert(bInProf == false);
m_start = DateTime.Now.Ticks;
bInProf = true;
}
public void End()
{
Debug.Assert(bInProf);
m_end = DateTime.Now.Ticks;
bInProf = false;
}
public long GetErapsed()
{
Debug.Assert(bInProf == false);
//Debug.Assert(m_end != m_start);
return (m_end - m_start)/10000;
}
public double GetErapsedD()
{
Debug.Assert(bInProf == false);
//Debug.Assert(m_end != m_start);
double d = (m_end - m_start);
return d/10000;
}
public void End(string msg)
{
End();
Log.OutLog("PRF:" + msg + "所要時間:" + GetErapsed() + "ms");
}
}
ProfTime p = new ProfTime();
p.Start();
//計測したい処理
p.End("ほげほげ処理");
etime = p.GetErapsed();//適当なところにこれを入れる
Application.Idle += new EventHandler(IdleHandler);
//アイドルイベントハンドラ
void IdleHandler(Object obj, EventArgs args)
{
//一回だけでやめたい場合
Application.Idle -= new EventHandler(IdleHandler);
//適当に何かやる
} class SyokenInfoEnumelator : IEnumerator
{
ArrayList mAry;
int idx;
public SyokenInfoEnumelator(ArrayList a)
{
mAry = a;
Reset();
}
public object Current
{
get
{
Debug.Assert(mAry != null);
Debug.Assert(0 <= idx && idx < mAry.Count );
return mAry[idx];
}
}
public bool MoveNext()
{
if( mAry.Count <= 0)
return false;
else if( idx < mAry.Count )
return ++idx < mAry.Count; //ここがちょっとややこしいので注意
else
return false;
}
public void Reset()
{
idx = -1;
}
}/// <summary>
/// リソースからテキストを取ってくる
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
String getResourceTxt(String name)
{
try
{
System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.StreamReader sr =
new System.IO.StreamReader(
myAssembly.GetManifestResourceStream(name),
System.Text.Encoding.GetEncoding("shift-jis"));
//内容を読み込む
String s = "";
s = sr.ReadToEnd();
/*
// 改行を取りたければこうする。
String ws;
do
{
ws = sr.ReadLine();
s += ws + " ";
}while( ws != null);
*/
//後始末
sr.Close();
return s;
}
catch(Exception ex)
{
Debug.WriteLine(ex.Message);
Debug.Assert(false);
return "";
}
}
public static bool ChkDblProcess()
{
Process p = Process.GetCurrentProcess();
Process[] procs = Process.GetProcessesByName(p.ProcessName);
foreach (Process wp in procs)
{
if (wp.Id != p.Id)
{
Log.Log_Write(LogType.ERROR, "同じプロセスが既に起動しています");
return false;
}
}
return true; //OK
}
二重起動チェックで以下のようにしている場合
If (UBound(Diagnostics.Process.GetProcessesByName _ (Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0) = True Then Exit Sub End If
以下のようなメッセージを伴う例外が発生することがある。
プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。
これは以下のレジストリキーが1になっていると起こるらしい。
HKEY_LOCAL_MACHINE \SYSTEM\CurrentControlSet\Services\PerfProc\Performance\Disable Performance Counters
パフォーマンスカウンタが無効になり、上記の部分でInvalidOperationExceptionが発生するとのこと
using System.Diagnostics; ... Process myProcess = new Process(); myProcess.StartInfo.FileName = "notepad.exe"; myProcess.StartInfo.Arguments = ""; myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal; myProcess.Start(); myProcess.WaitForExit();
System.AppDomain.GetCurrentThreadId()を使うのは古い仕様なので
Thread.CurrentThread.ManagedThreadId;を参照
public class CPMeshInfo : System.IComparable
{
public int No;
public int Hoge;
public int Fuga;
public Int32 CompareTo(Object o)
{
return this.No - (o as CPMeshInfo).No;
}
}