2011-04-02 76 views
2

在過去的幾個月中,我使用Filesystemwatcher來查找系統中的文件系統更改。但是,當我在GAC中安裝程序集時,Filesystemwatcher不會捕獲在GAC中註冊的dll。這是代碼。雖然該文件在位置C:\ Windows \ assembly \ GAC_MSIL \ ConsoleApplication2 \ 1.0.0.0__aea873120d858924 \ consoleapplication2.dll中創建,但我無法在「str」變量中找到該文件。相反,我有它的目錄路徑。有誰知道它出錯的地方。Filesystemwatcher和GAC

static void Main(string[] args) 
    { 

     str = new List<string>(); 
     FileSystemWatcher fs = new FileSystemWatcher(@"c:\"); 
     fs.IncludeSubdirectories = true; 
     fs.Created += new FileSystemEventHandler(OnFileCreate); 
     fs.Changed += new FileSystemEventHandler(OnFileCreate); 
     fs.EnableRaisingEvents = true; 
     new System.EnterpriseServices.Internal.Publish().GacInstall(@"C:\Users\jijiadmin\Documents\Visual Studio 2008\Projects\ConsoleApplication2\ConsoleApplication2\bin\Debug\consoleapplication2.dll"); 
     Console.ReadKey(); 
    } 
    static void OnFileCreate(object e, FileSystemEventArgs ev) 
    { 
      str.Add(ev.FullPath); 
    } 

回答

0

這似乎是filesystemwatcher的問題,並將其提交給Microsoft。 感謝您的回覆。

1

我懷疑你不會找到一種方法來讓它很好地工作。如您所知,GAC提供了一個虛擬文件系統,允許具有相同名稱但不同版本的程序集就像在並排的同一目錄中一樣。我懷疑FileSystemWatcher無法看透這個門面。

也許你可以維護自己的實際目錄結構中存儲內容的緩存,並遍歷此緩存以查看C:\Windows\Assembly根中的虛擬程序集更改時實際發生了什麼變化?

0

我無法評論它,因此寫在答案頁。 @Chris 如果你通過Windows資源管理器看到它。您只能找到路徑C:\ Windows \ Assembly,我可以在GAC中找到所有組件。這看起來像一個文件夾,但它是虛擬的,如你所說。我無法複製和粘貼。

但是,只有當你通過命令提示符時,你可以可視化的dll的存在。我希望您也同意,無論如何,Windows必須將該程序集存儲在物理內存的某個位置,並可以用不同的名稱(如GAC)來表示它。它存儲在C:\ Windows \ assembly \ GAC_MSIL \ ConsoleApplication2 \ 1.0.0.0__aea873120d858924中。

文件夾名稱1.0.0.0__aea873120d858924只是程序集的版本和公鑰。爲了維護多個程序集,他們使用這兩個數據創建文件夾。

在這裏,您可以執行您使用文件夾執行的所有操作,但在命令提示符下執行。

我知道filesystemwatcher無法看這個文件夾。但是,如果我將示例文件「a.txt」複製到文件夾1.0.0.0__aea873120d858924,它會監視並正確報告我。

0

你的機器是32位的,而服務器是64位的?

我有一個類似的問題,我正在編譯應用程序在任何平臺上運行。問題在於它安裝在服務器上的OracleDataAccess組件是32位的,所以組件僅安裝在GAC_32文件夾中。因此,當應用程序嘗試在64位模式下運行時,它找不到程序集。

所以我只是重新編譯應用程序爲x86(32位),它的工作。應用程序在32位模式下運行,並在正確的文件夾中查找程序集。

你試過嗎?