Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell 从dll加载程序集';字节数组_Powershell_Dll_.net Assembly_7zip - Fatal编程技术网

Powershell 从dll加载程序集';字节数组

Powershell 从dll加载程序集';字节数组,powershell,dll,.net-assembly,7zip,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时,这不会引发异常: [Se

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

$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调用带有“1”参数的“SetLibraryPath”:“SevenZip.SevenZipLibraryManager”的类型初始值设定项引发了异常。”

但是,如果我将
[System.Reflection.Assembly]:Load($dllbyteraray)
替换为

Add-Type -path $pathToDll
它很好用

如果我从字节数组加载程序集,为什么会引发异常

编辑: 我希望使用字节数组加载它的原因是,如果我使用
添加类型
,它似乎在.dll上保留了一个句柄,我以后无法使用
删除项
删除它

编辑:这起作用了:

[System.Configuration.ConfigurationManager]::AppSettings["7zLocation"] = $pathToDll

调用
[SevenZip.SevenZipExtractor]:SetLibraryPath($pathto7zdell)
我认为您遇到了.NET的基本限制。一旦程序集加载到应用程序域中,就不会卸载该dll。您需要使用程序集中的类型还是仅对其进行反射?如果是后者,则可以将DLL加载到。

库正在使用反射通过
Assembly.getExecutionGassembly().Location
查找自己的路径,并使用此值初始化一些静态字段:

但是,如果直接从字节数组加载程序集,则位置为null,GetDirectoryName将引发异常。这不是PowerShell的限制,而是库的问题

可能存在一种解决方法,即在尝试加载库之前加载System.Configuration并设置7zLocation应用程序设置


由于库似乎试图让您通过
SetLibraryPath
设置路径,这可能是一个错误,应该向维护人员报告。

但是为什么我调用[SevenZip.SevenZipExtractor]时它会引发异常::SetLibraryPath($pathto7zdl)?我猜正在加载的程序集依赖于另一个找不到的程序集。首先尝试加载缺少的程序集。您需要深入了解该异常的详细信息—查找其InnerException并对其进行检查—递归直到InnerException为null。
private static string _libraryFileName = ConfigurationManager.AppSettings["7zLocation"] ??
        Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "7z.dll");