2010年12月29日 星期三

SystemException 無法建立 AppDomain

執行MVC專案時出現 Failed to create AppDomain
後來建立一個新的MVC專案也是同樣的問題

結果原因似乎是出現在"小紅傘"身上,移除後就正常了
之後再將"小紅傘"重新安裝回去

環境:vs2010, mvc2 web 應用程式

2010年12月2日 星期四

UMLet執行失敗

執行UMLet,在Win7中明明已經裝了java還出現
You have to install Java (www.java.com) to run UMLet!

解決方法是在環境變數

電腦 -> 右鍵 -> 內容 -> 進階系統設定 -> 環境變數
在使用者變數 -> 新增 ->
變數名稱(N) : PATH
變數值(V):C:\Program Files (x86)\Java\jre6\bin

確定後重新開機~ 完成!

2010年11月5日 星期五

使用FFmpeg將影像轉成H264

用FFmpeg在command line下將任何格式轉成h264
畫質及速度都還不錯的參數

string paras = string.Format("-i \"{0}\" -crf 35.0 -vcodec libx264 -acodec libfaac -ar 48000 -ab 128kb -coder 1 -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -me_method hex -subq 6 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -threads 0 \"{1}\"", _srcFilePath, _destFilePath);

上面是c#的code
命令列的話當然就是
c:\> ffmpeg.exe -i "c:\src.avi" -crf 35.0 -vcodec libx264 -acodec libfaac -ar 48000 -ab 128kb -coder 1 -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -me_method hex -subq 6 -me_range 16 -g 250 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -b_strategy 1 -threads 0 "c:\dest.mp4"

粗體字的部分自行換掉吧

ps. _destFilePath 副檔名記得設為.mp4

如果參數使用失敗的話,可能是版本問題?!
這裡放上我測試過的
FFmpeg dowload

2010年9月14日 星期二

在程式中變更ConnectionString

通常使用Membership這類物件時,會建立web.config or app.config來設定連線字串及MembershipProvider
以下範例可以動態的在程式碼中變更資料庫連線字串


private void SetProviderConnectionString(string connectionString)
{
// Set private property of Membership, Role and Profile providers.
//Do not try this at home!!
FieldInfo connectionStringField = Membership.Provider.GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);

if (connectionStringField != null)
connectionStringField.SetValue(Membership.Provider, connectionString);

FieldInfo roleField = Roles.Provider.GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);

if (roleField != null)
roleField.SetValue(Roles.Provider, connectionString);

FieldInfo profileField = ProfileManager.Provider.GetType().GetField("_sqlConnectionString", BindingFlags.Instance | BindingFlags.NonPublic);

if (profileField != null)
profileField.SetValue(ProfileManager.Provider, connectionString);
}

2010年9月7日 星期二

解決MsSQL資料庫重新命名失敗問題

使用Microsoft SQL Server Management Studio
右鍵點選要Rename的資料庫...結果出現5030錯誤
這表示資料庫正被使用中(大概XD)

所以,一個比較直覺的想法就是將資料庫停用,強迫所有使用者斷線
然後再重新將資料庫啟用

首先在要Rename的資料庫(右鍵)->工作->卸離,勾選卸除連接,然後按確定
這樣database就會被卸載了。

然後資料庫(右鍵)->附加->選擇剛剛被卸載的資料庫檔案,將資料庫掛回去
這樣database應該就可以rename了。

ps. sp_who這個SQL指令可以查出database正在被那些程序使用


2010年8月9日 星期一

取得程式碼所在位置的方法(Method)資訊or呼叫來源方法

在Debug的時候會將錯誤訊息寫入log檔,或是用messageBox跳出錯誤題示
有些時候會希望得知,這些錯誤訊息是在什麼Method中被呼叫的
又或者希望得知,發生錯誤訊息所在的Method,又是被哪個Method所呼叫

System.Reflection.MethodBase類別,就是用來存放Method資訊的
其中MethodBase.Name就可以取得方法名稱

使用System.Reflection.MethodBase.GetCurrentMethod();
可以取得目前程式碼所在的Method

System.Diagnostics.StackTrace類別,顧名思義就是用來追蹤堆疊的
使用StackTrace.GetFrame(0).GetMethod();
可以取得目前程式碼所在的Method
使用StackTrace.GetFrame(1).GetMethod();
可以取得目前程式碼所在的Method的上一層Method
使用StackTrace.GetFrame(2).GetMethod();
可以取得目前程式碼所在的Method的上一層Method的上一層Method.... 以此類推

ps. 使用StackTrace前必須先建立物件
ex: System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
st.GetFrames(1).GetMethod();

2010年8月4日 星期三

當非正常關閉程式時(如:登出或關機),讓程式完成最後的動作(如:釋放資源或資料回存)

有時候使用者並不會以標準的程序來結束程式
如直接按下電源鈕或按下開始->電腦關機來結束windows系統
或者是使用工作管理員來結束程式

此時,我們希望在程式結束前能執行一些必要的程式碼,例如釋放資源或儲存設定之類的
這時就可以使用下面兩個事件來處理,將這些必要的程式碼放在事件處理函式內

當使用者登出或結束windows時,可以使用SystemEvents.SessionEnding 事件來處理
Namespace為 Microsoft.Win32

當使用者使用工作管理員來結束程式時,可以使用Application.ThreadExit 事件來處理
Namespace為 System.Windows.Form

2010年7月19日 星期一

Form.GotFocus And Form.LostFocus 失效?

原本自訂了一個繼承Control的元件後將他加到Form裡面
發現Form的GotFocus and LostFocus事件就失效了
本來以為是自己的元件中是不是有些什麼奇怪的code
結果簡單的測試了一些公規的元件,發現一樣有這個問題

失效的有 Control, TextBox, Button
正常的有 PictureBox, Label

解決的辦法如下
this.SetStyle(System.Windows.Forms.ControlStyles.Selectable, false);
在自己的元件的建構內加入上面那行code
如果用的是公規元件的話,那就只好用繼承的方式處理了

2010年3月14日 星期日

C#自訂型態的強制轉換

我們常看到基本資料型態的強制轉換,如下:
int i = (int)123.456;


如果今天我們分別自訂了兩個無任何繼承關係的類別
要如何達成強制轉換呢?

ClassA x = new ClassA();
ClassB y = (ClassB)x;

在C#中可以使用implicit operator關鍵字來達成

這裡舉個簡單的例子,兩個類別的定義如下

class ClassA
{
 public int Amount = 0;
 public ClassA(int amount) { this.Amount = amount; }
}

class ClassB
{
 public string Content = string.Empty;
 public ClassB(string content) { this.Content = content;}
}

下面要示範的是,當ClassA強轉成ClassB時
ClassB.Content的字串,會是ClassA.Amount數個英文字母
假設ClassA.Amount等於10,則強轉後ClassB.Content會等於ABCDEFGHIJ

在ClassB中加入以下程式碼

public static implicit operator ClassB(ClassA obj)
{
 int amount = 0;
 if (obj.Amount > 26 || obj.Amount < 0)
  throw new Exception("out of range");
 else
  amount = obj.Amount;

 StringBuilder sb = new StringBuilder();
 for (int i = 0; i < amount; i++)
  sb.Append((char)(67 + i));
 ClassB result = new ClassB(sb.ToString());
 return result;
}

現在我們可以執行強轉了

static void Main(string[] args)
{
 ClassA a = Class(10);
 ClassB b = (ClassB)a;
 Console.WriteLine(b.Content);
 Console.Read();
}

在Blogger中加入程式碼區塊(使用SyntaxHighlighter )

資訊主頁版面配置修改HTML
</body>標籤之前加入下方程式碼,然後儲存範本


<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shCore.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushAS3.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushBash.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCpp.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushColdFusion.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCSharp.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCss.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushDelphi.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushDiff.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushErlang.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushGroovy.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJava.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJavaFX.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJScript.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPerl.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPhp.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPlain.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPowerShell.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPython.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushRuby.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushScala.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushSql.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushVb.js"></script>

<script type="text/javascript"
src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushXml.js"></script>

<link type="text/css" rel="stylesheet"
href="http://alexgorbatchev.com/pub/sh/2.1.364/styles/shCore.css"/>

<link type="text/css" rel="stylesheet"
href="http://alexgorbatchev.com/pub/sh/2.1.364/styles/shThemeDefault.css"/>

<script type="text/javascript"> SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.1.364/scripts/clipboard.swf';

SyntaxHighlighter.config.bloggerMode = true;

SyntaxHighlighter.all();

</script>





之後在建立新文章便可以使用程式碼區塊了,使用方式如下:
新文章➝切換到修改html,加入程式碼 。(ps.發布文章後才會正確顯示)




<pre class="brush: language;">
// 欲顯示的程式碼
</pre>



language的部分就是想要顯示的語言,可用下表對應名稱替換


語言名稱對應名稱
ActionScript3 as3, actionscript3
Bash/shell bash, shell
ColdFusion cf, coldfusion
C# c-sharp, csharp
C++ cpp, c
CSS css
Delphi delphi, pas, pascal
Diff diff, patch
Erlang erl, erlang
Groovy groovy
JavaScript js, jscript, javascript
Java java
JavaFX jfx, javafx
Perl perl, pl
PHP php
Plain Text> plain, text
PowerShell ps, powershell
Python py, python
Ruby rails, ror, ruby
Scala scala
SQL sql
Visual Basic vb, vbnet
XML xml, xhtml, xslt, html, xhtml



如下:以C#作為顯示語言



<pre class="brush: c-sharp;">

class CTest

{

class CTest() { }

}

</pre>


2010年1月25日 星期一

Exception 訊息

在.Net中Thread若跳出Exception,則無法在Main Thread中使用try catch攔截,此時會跳出
如果希望截取Thread的Exception可使用
AppDomain.CurrentDomain.UnhandledException 事件
-----------------------------------------------------------------
若是呼叫由C/C++所寫的API而發生Exception,則會跳出