2011-04-02 81 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位模式下运行,并在正确的文件夹中查找程序集。

你试过吗?