Powershell 2.0 Runtime исключение; не удалось загрузить файл или сборку - PullRequest
0 голосов
/ 23 ноября 2010

Сценарий, который я пытаюсь исправить, - это сценарий, в котором dll обнаруживаются при компиляции C #, но не обнаруживаются при выполнении кода c #. Это Powershell 2.0. Наша политика не использовать GAC. Код c # в функции Powershell похож на этот:

function functionDef
{
  [System.Reflection.Assembly]::LoadFrom("c:\myDir\func1.dll")
  [System.Reflection.Assembly]::LoadFrom("c:\myDir\func2.dll")

  $ref = @("c:\myDir\func1.dll","c:\myDir\func2.dll")

  $cCode = @"
    using System;
    using func1;
    using func2;

    namespace serializedDef
    {
       public class defSerialization
       {

          public defSerialization () {}

   <# 
             method and properyty defs not included
          #>

          public double setSpec {
  set { computeDef(value)}
  get {return spefDef}
          }

   private double computeDef ( double value)
   {
            <# calls to methods in DLLS loaded above
             #>
   }
       }
    }
 "@
 add-type -ReferencedAssemblies $ref -TypeDefinition $cCode -passthru - Language CSharpVersion3 | out-null
}

Когда эта функция вызывается, код c # компилируется без ошибки.

Я добавляю путь к двум ссылочным DLLS в значение $ env: path. В другом месте установлена ​​сторонняя DLL-библиотека пути к DLL; этот путь также добавляется к $ env: path. Разрешения на оба пути широко открыты для всех в целях тестирования.

Затем я создаю экземпляр кода C # как новый объект:

 $myObject = new-object serializedDef.defSerialization

Когда я вызываю функцию:

 $myObject.setSpec = 35.5

Я получаю ошибку:

Exception setting "setSpec": "Could not load  file or assmbly
'func1', Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0a7c34216660f47' or one of its dependencies. The system cannot find the file specified."
At line:1 char:11
+ $myObject. <<< setSpec = 35.5
  + CategogyInfo          : InvalidOperation: (:) [], RuntimeException
  + FullyQualifedErrorId  : PropertyAssignmentException

Насколько я понимаю, ошибка, скорее всего, связана с методом или подобным, на который ссылается одна из библиотек DLL, которую невозможно найти. Как мне отследить это?

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010

.NET сборки не загружаются с пути. Основной каталог приложения - это каталог установки PowerShell, и вы не хотите копировать свои сборки там. Я рекомендую перехватить событие AppDomain.AssemblyResolve. Это событие вызывается, когда CLR не может найти сборку, в этот момент вы можете указать полный путь к рассматриваемой сборке. Посмотрите на это ТАК сообщение для получения дополнительной информации.

0 голосов
/ 24 ноября 2010

Я смоделировал решение после публикации, на которую есть ссылка в первом ответе ( Как я могу заставить PowerShell Added-Types использовать добавленные типы ).Он отлично работает на платформах x87 и x64.Спасибо вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...