0

複数のクライアント マシンにあるソフトウェアの .DLL ローダー/アップデーターを実装しています。ファイルが最新バージョンであるかどうかを判断するために、マシン上のファイルのバージョンを確認し、それを SQL に渡す必要があります。フォルダー構造は次のようになります。

- 応用

--- ファイル

---- サブフォルダ

----- Loader.exe

ローダー .exe はList(of FileInfo)、アプリケーション フォルダーから を取得します。このフォルダーにはさまざまなアセンブリがあり、チェックするためにアセンブリのバージョンを取得するためにAssembly.LoadFile(x.FullName).GetName().Version、ファイルの更新または後でファイルへのアクセスが必要な場合は、これを使用しています。情報をデータテーブルに取得してから、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()

したがって、明らかに、私がアセンブリ バージョンを参照しているセクションは、問題のファイルへのアクセスを破棄する何らかの using ステートメントを変更または実装する必要がある場所です。

注:完全なLINQである必要はなく、適切なusingステートメントまたはソリューションを示している場合は、C#でも回答を受け入れます。

4

2 に答える 2

1

必要なものが見つかりました

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

これを使用すると、必要な情報だけがアセンブリ全体に読み込まれません。つまり、ファイルがロックされません。みんなの提案に感謝します。

于 2012-09-10T13:40:00.573 に答える
0

を呼び出して、アセンブリをリフレクションのみのコンテキストに読み込もうとしましたAssembly.ReflectionOnlyLoadFrom()か?

別の方法は、アセンブリをアンロードできないため、新しい を作成するAppDomainことです。アセンブリをこの新しいドメインにロードし、後でアンロードします。AppDomain

于 2012-09-10T10:15:45.510 に答える