我正在为多个客户端计算机上的软件实现.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。
答案 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
。