2017-02-21 2 views
0

У меня есть проект C#, используемый в качестве командлета PowerShell - это должен быть API для основной функции продукта, поэтому мне нужно ссылаться на большое количество DLL в моей библиотеке PowerShell ,dll dll, который ссылается на другую DLL проекта, не работает при загрузке

Моя проблема заключается в том, что клиенты хотят загрузить dll PowerShell из любого места без настроек рабочего каталога в папку программы, где расположены все 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 

Exception вызова «LoadFrom» с «1» аргумент (ы): «не удалось загрузить файл или сборку файл»: ///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: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId: FileNotFoundException

ответ

0

Гадать здесь, как вы убежище» t предоставила ошибку, но если она работает из одного и того же каталога, а не из другого, вероятно, что DLL C# использует относительные пути.

Когда текущий каталог равен C:\Program Files(x86)\MyProduct, он не является m atter, если вы используете полный путь или просто Resources\MyFile.dat, оба будут в том же месте. Однако если вы в корне C:, то относительный путь будет искать C:\Resources\MyFile.dat, которого, конечно, не существует. Когда вы используете C:\Program Files(x86)\MyProduct\Resources\MyFile.dat, не имеет значения, каков текущий каталог, он всегда будет работать.

Проверьте свою C# DLL для любых относительных путей и временно измените рабочий каталог или используйте абсолютные пути.

0

Один из подходов может заключаться в следующем: добавьте свой путь сборки C:\Program Files(x86)\MyProduct к PSModulePath переменной окружения. Как только это будет сделано, вы можете выполнить import-module -name <name of your module> и загрузить его из своей папки. В этом случае вам не нужно будет загружать свою сборку явно (скорее всего).

Для получения дополнительной информации выполните следующую команду в powershell и проверьте данные, указанные для параметра -name.

get-help import-module -detailed

Смежные вопросы