加载程序集会锁定文件

时间:2012-09-10 10:08:33

标签: c# .net vb.net

我正在为多个客户端计算机上的软件实现.DLL加载程序/更新程序。我们需要检查机器上的文件版本,然后将其传递给SQL,以确定文件是否是最新版本 - 我们有这样的文件夹结构:

  

- 申请

     

---档案

     

---- SubFolder

     

----- Loader.exe

loader .exe从应用程序文件夹中获取List(of FileInfo)。这个文件夹中有各种程序集,要获取程序集的版本以便检查,我使用Assembly.LoadFile(x.FullName).GetName().Version并使用它,如果文件需要更新或稍后访问,则在loader.exe上有文件正在使用。我将信息转换为数据表,然后我将其传递给SQL中的存储过程。

Dim dt As New DataTable("ModuleTableVariable")
dt.Columns.Add("ModuleName")
dt.Columns.Add("ModuleVersion")
Dim rows As List(Of DataRow) = fileList.Select(Function(x)
                                                 Dim row = dt.NewRow()
                                                 row("ModuleName") = x.Name
                                                 If x.Extension = ".dll" Or x.Extension = ".exe" Then
                                                   row("ModuleVersion") = Assembly.LoadFile(x.FullName).GetName().Version
                                                 Else
                                                   row("ModuleVersion") = x.CreationTime
                                                 End If
                                                 Return row
                                               End Function).ToList()

很明显,我引用汇编版本的部分是我需要更改或实现某种使用语句的部分,该语句将处理对相关文件的访问,是否有任何想法?

注意:如果您显示合适的使用声明或解决方案,我也会接受C#中的答案,并不一定是完整的LINQ。

2 个答案:

答案 0 :(得分:1)

找到我需要的东西

AssemblyName.GetAssemblyName("filename.exe").Version 

使用它不会只加载整个程序集所需的信息,这意味着它不会锁定文件。谢谢大家的建议。

答案 1 :(得分:0)

您是否尝试过调用reflection only context

将程序集加载到Assembly.ReflectionOnlyLoadFrom()

另一种方式是create a new AppDomain,导致you simply can't unload an assembly。将程序集加载到此新域中,然后加载unload the AppDomain