gpt4 book ai didi

powershell - 从dll的Byte数组加载程序集

转载 作者:行者123 更新时间:2023-12-02 23:44:18 24 4
gpt4 key购买 nike

我正在尝试使用以下方法加载程序集:

$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)

它说: Exception calling "SetLibraryPath" with "1" argument(s): "The type initializer for 'SevenZip.SevenZipLibraryManager' threw an exception."
但是,如果我将 [System.Reflection.Assembly]::Load($dllByteArray)替换为
Add-Type -path $pathToDll

它工作正常。

如果从Byte数组加载程序集,为什么会引发异常?

编辑:
我想使用Byte数组加载它的原因是因为如果我使用 Add-Type,它似乎在.dll上保留了句柄,以后无法使用 Remove-Item删除它。

编辑:这可行:
[System.Configuration.ConfigurationManager]::AppSettings["7zLocation"] = $pathToDll

需要在调用 [SevenZip.SevenZipExtractor]::SetLibraryPath($pathTo7zDll)之前调用

最佳答案

该库正在使用Reflection通过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的Byte数组加载程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30203824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com