我正在尝试使用以下方法加载程序集:
$pathToDll = "C:\zip\SevenZipSharp.dll"
$pathTo7zDll = "C:\zip\7z.dll"
$dllByteArray= [System.IO.File]::ReadAllBytes($pathToDll)
[System.Reflection.Assembly]::Load($dllByteArray)
但是,当我想像这样使用库 SevenZip.SevenZipExtractor
时,这不会引发异常:
[SevenZip.SevenZipExtractor]::SetLibraryPath($pathTo7zDll)
它说:使用“1”个参数调用“SetLibraryPath”时出现异常:“‘SevenZip.SevenZipLibraryManager’的类型初始值设定项引发了异常。”
但是,如果我将 [System.Reflection.Assembly]::Load($dllByteArray)
替换为
Add-Type -path $pathToDll
效果很好。
如果我从字节数组加载程序集,为什么会抛出异常?
编辑:
我想使用字节数组加载它的原因是,如果我使用 Add-Type
它似乎保留了 .dll 的句柄,并且我无法使用 Remove-Item 删除它
稍后。
编辑:这有效:
[System.Configuration.ConfigurationManager]::AppSettings["7zLocation"] = $pathToDll
需要在调用[SevenZip.SevenZipExtractor]::SetLibraryPath($pathTo7zDll)之前调用它
最佳答案
该库正在使用反射通过 Assembly.GetExecutingAssembly().Location
查找自己的路径,并使用该值初始化一些静态字段。 See the source code :
private static string _libraryFileName = ConfigurationManager.AppSettings["7zLocation"] ??
Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "7z.dll");
但是,如果直接从字节数组加载程序集,则 Location 为 null,并且 GetDirectoryName 将引发异常。这不是 PowerShell 的限制,而是库的问题。
可能有一个可能的解决方法,即在尝试加载库之前加载 System.Configuration 并设置 7zLocation 应用程序设置。
由于该库似乎试图让您通过 SetLibraryPath
设置路径,这可能是一个错误,应报告给维护者。
关于powershell - 从 dll 的字节数组加载程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203824/