[英]C# cmdlet dll that references other project dll fails on load
我有一個C#項目用作PowerShell cmdlet-這應該是產品主要功能的API-因此我必須在我的PowerShell庫中引用很多dll。
我的問題是客戶希望從任何位置加載PowerShell dll,而無需將工作目錄設置為所有dll所在的程序文件夾。 但是,僅當我通過快捷方式打開Powershell時,才能使用PowerShell命令,該快捷方式將工作目錄設置為如下所示的程序文件文件夾:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -noexit -command "[reflection.assembly]::loadFrom('.\PSAPI.dll') | import-module"
並將工作目錄也設置到我已經安裝了該產品的程序文件文件夾中。
如果我只是用
[Reflection.Assembly]::LoadFile("C:\Program Files(x86)\MyProduct\PSAPI.dll")
要么
[Reflection.Assembly]::LoadFrom("C:\Program Files(x86)\MyProduct\PSAPI.dll")
它總是失敗。 是否有解決方案(不將所有文件復制到PowerShell文件夾)?
這是我嘗試和得到的錯誤-我無法以其他方式設置引用的dll-.NET應用程序正在工作目錄中查找引用的dll-我在powershell中設置了工作目錄以確保我處於正確的目錄,但不會加載我的模塊
[reflection.assembly]::loadFrom( 'C:\Program Files (x86)\ASG-Remoteesktop 2016\ASGRD-PSAPI.dll' ) | import-module
使用“ 1”參數調用“ LoadFrom”的異常:“無法加載文件或程序集'file:/// C:\\ Program Files(x86)\\ ASG-Remoteesktop 2016 \\ ASGRD-PSAPI.dll”或以下之一依存關系。系統找不到指定的文件。” 在第1行:char:1 + [reflection.assembly] :: loadFrom('C:\\ Program Files(x86)\\ ASG-Remoteesktop 2016 \\ A ... + ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ + CategoryInfo:未指定:(:) [],MethodInvocationException + FullyQualifiedErrorId:FileNotFoundException
在這里猜測是因為您沒有提供錯誤,但是如果它在同一目錄下而不是在另一個目錄下工作,則可能是C#DLL使用相對路徑。
當前目錄為C:\\Program Files(x86)\\MyProduct
,使用完整路徑還是使用Resources\\MyFile.dat
都沒有關系,兩者都將位於同一位置。 但是,如果您位於根目錄C:
則相對路徑將查找C:\\Resources\\MyFile.dat
,這當然不存在。 當您使用C:\\Program Files(x86)\\MyProduct\\Resources\\MyFile.dat
時,無論當前目錄是什么,它都將始終有效。
檢查C#DLL中是否有相對路徑,然后臨時更改工作目錄或使用絕對路徑。
一種方法是:將程序集路徑C:\\Program Files(x86)\\MyProduct
到PSModulePath
環境變量中。 完成后,您可以執行import-module -name <name of your module>
,它將從您的文件夾中加載它。 在這種情況下,您將不需要顯式加載程序集(最有可能)。
有關更多詳細信息,請在powershell中執行以下命令,並檢查為-name
參數指定的詳細信息。
get-help import-module -detailed
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.