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

标签 powershell dll .net-assembly 7zip

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

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

相关文章:

powershell - 如何搜索包含另一个数组中的项目的对象数组?

azure - 使用 Get-AzLocation 选择特定的 Azure 位置

.net-assembly - 什么是 .NET 汇编文化?

azure - 使用 PowerShell 列出 blob、文件、表、队列的已用空间?

sql-server - PowerShell 中 Invoke-Sqlcmd 的 Unicode 支持

用于 C++ 的 C# 包装器

c++ - 将代码移动到函数中时,错误 0xC0000138 在 DLL "myApp.exe"中找不到序号

c# - 使用嵌入式 DLL?

c# - 将 DLL 加载到一个单独的 AppDomain 中,只有已知的通用接口(interface)

c# - 如何在新流程中启动第二个项目的新实例