использование интерфейса dotnet в классе powershell - PullRequest
0 голосов
/ 07 декабря 2018

Я хочу использовать в моей PowerShell интерфейс из моей пользовательской библиотеки .net, но я всегда получаю эту ошибку:

class Logger : Systems.SysBiz.BaseTransversal.ILoggerBl
+                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unable to find type [Systems.SysBiz.BaseTransversal.ILoggerBl].

Если я использую, например, интерфейс IComparable из пространства имен системы, он работает нормально.

[System.Reflection.Assembly]::LoadFile('MyPath\BaseTransversal.dll')

class Logger : Systems.SysBiz.BaseTransversal.ILoggerBl
{

    [bool] $SendMailException = $false;

    Logger()
    {

    }

    [void] LogFatal([string] $message, [object[]] $args)
    {
        Write-Host $message;
    }

    [void] LogException([System.Exception] $ex, [string] $message, [object[]] $args)
    {
        Write-Host $this.FormatException($ex);            
    }

    [void] LogError([string] $message, [object[]] $args)
    {
        Write-Host $message;
    }

    [void] LogWarning([string] $message, [object[]] $args)
    {
        Write-Host $message;
    }

    [void] LogInfo([string] $message, [object[]] $args)
    {
        Write-Host $message;
    }

    [void] LogTrace([string] $message, [object[]] $args)
    {
        Write-Host $message;
    }

    [void] LogDebug([string] $message, [object[]] $args)
    {
        Write-Host $message;
    }

    [string] FormatException([System.Exception] $ex)
    {
        if (!$ex)
        {
            return "";
        }

        return "<br/><b>" + $ex.Message + "</b><p>" + $ex.StackTrace + "</p><br/>" + $this.FormatException($ex.InnerException);
    }
}

Здесь мой .net интерфейс

namespace Systems.SysBiz.BaseTransversal
{
    public interface ILoggerBl
    {
        bool SendMailException { get; }
        void LogFatal(string message, params object[] args);
        void LogException(Exception ex, string message, params object[] args);

        void LogError(string message, params object[] args);

        void LogWarning(string message, params object[] args);

        void LogInfo(string message, params object[] args);

        void LogTrace(string message, params object[] args);

        void LogDebug(string message, params object[] args);

        string FormatException(Exception ex);
    }
}

ОБНОВЛЕНИЕ: Добавлен полный код PowerShell класса. Я также пробовал использовать пустой интерфейс в моем .NET-коде, но похоже, что я могуне вижу / не использую мои интерфейсы, даже если они общедоступны.Я что-то пропустил

ОБНОВЛЕНИЕ 2: добавлена ​​точная ошибка

1 Ответ

0 голосов
/ 10 декабря 2018

У меня была такая же проблема.Классы PowerShell обрабатываются до начала оценки сценария.Таким образом, ваша первая строка НЕ ​​запускается до того, как класс пытается наследовать от него, и поэтому тип не определен.Решением этой проблемы является перемещение классов и загрузка в два отдельных скрипта.Затем поставьте их в точку в третьем скрипте, который формирует вашу точку входа.Загрузите скрипт, который определяет внешние типы firs.Затем загрузите скрипт, который определяет ваши классы, таким образом, типы импортируются до того, как второй скрипт начнет оценивать.

# in file typeLoad.ps1
Add-Type -TypeDefinition "
public interface IHaveName {
    string Name { get; set; }
}"

# in file classes.ps1
class B : IHaveName {

}

# in file main.ps1
. $PSScriptRoot\typeLoad.ps1
. $PSScriptRoot\classes.ps1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...