2017年8月8日

Asp.net Web client使用excel元件發生錯誤

擷取元件 (CLSID {00024500-0000-0000-C000-000000000046}) COM Class Factory 失敗
擷取元件 (CLSID  {00024500-0000-0000-C000-000000000046})  COM Class Factory失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
描述在執行目前 Web 要求的過程中發生未處理的例外狀況。請檢閱堆疊追蹤以取得錯誤的詳細資訊,以及在程式碼中產生的位置。 

例外狀況詳細資訊System.Runtime.InteropServices.COMException: 擷取元件 (CLSID  {00024500-0000-0000-C000-000000000046})  COM Class Factory 失敗,因為發生下列錯誤: 80040154 類別未登錄 (發生例外狀況於 HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))
以下嘗試的解決方式:

1. Start->run->regedit 
Find 00024500-0000-0000-C000-000000000046 ->資料夾按右鍵內容,安全性加入NETWORK SERVICE給予權限,找遍所有00024500-0000-0000-C000-000000000046相關的機碼全部設了Network service 與 IIS_IUSRS完全控制的權限,結果失敗
2. Start -> run -> DCOMCNFG
來想照著以上說明去「元件服務」設定DCOM元件,竟然沒有Microsoft Excel Application。因為Excel32位元,64位元的作業系統看不到該元件,結果失敗
3.在web.config 加入
帳號密碼請先使用本機administrator帳號試比較沒問題
若是 Server 2008 x64 請建立下述資料夾
C:\Windows\SysWOW64\config\systemprofile\Desktop
若是 Server 2008 x86 請建立下述資料夾
C:\Windows\System32\config\systemprofile\Desktop
以上的設定。結果成功
4. Start -> run -> mmc comexp.msc /32
元件服務 -> 電腦 ->我的電腦 ->DCOM設定 ->Microsoft Excel Application ->安全性->啟動和啟用權限&存取權限->自訂權限加入Network serviceIIS_IUSRS完全控制權限, 識別身份用互動式使用者。結果成功

參考:http://tsaiyuchi.blogspot.tw/2011/02/excel-manipulate.html#more



存著用,現在用不到,這抄別人的 … 

型別轉換


public class C
{
    public T Data;
}

public class C : C
{
}

public C c1;
public C c2;

上面的c1無法轉換成c2,但我就是有這種需求…可能是我設計的不好 … 
我的Interface中訂了 C Query(string str);
在各個實作介面的物件中,回傳是各種C ,C等等…
因為要統一在外面接到就直接把C轉成Json字串,
所以需要C能正常轉型成C。

最後是在C裡面實做implicit(隱含轉換)


public class C
{
    public T Data;

    public static implicit operator C ( C cc )
    {
        var obj   = new C ();

        obj.Data  = cc.Data;

        return obj;
    }
}

這樣c2 = c1;的時候就不會出錯了!

隱含轉換的準則:
  1. 不會拋出例外
  2. 不會遺失資訊
所以其他程式設計人員可以不用注意這個東西直接拿來使用。

相對來說,如果希望其他程式設計人員在做轉型時可以注意到會有差異,希望他有認知到有做轉型的動作,
那實做的implicit關鍵字要改成explicit這樣在轉換的時候必須加上轉型關鍵字,寫成

c2 = (C)c1;

2017年8月1日

刪除某時間之前的檔案

本來要寫個batch file去定期刪除某個時間之前的檔案,
後來發現只要一行指令就完成了,也不用寫batchfile了。

forfiles /P "D:\Logs\IISLog" /M *.log /S /D -30 /C "cmd /C Del @path"