Может PowerShell вызывать подклассы из внешних C # DLL - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть простой код из: https://www.codeguru.com/csharp/csharp/cs_misc/dllsandexecutables/article.php/c4239/Creating-and-Using-C-DLLs.htm

, который генерирует dll для выполнения простой математики.Я хотел добавить подкласс

namespace MathFunctions
{
    public class Add : MultiClass
    {
        public static int MultiplyAndAdd(int a, int b, int c)
        {
            return (a * b) + c;
        }
    }
}

Затем вызвать его из powershell.

Запуск powershell для мастер-классов возвращает данные без проблем

Import-module("C:\temp\MathFunctions.dll")
[MathFunctions.MultiClass]::Multiply(10, 2)

возвращает 20как и ожидалось, но я не могу понять формат для доступа к подклассу.Я пробовал варианты на:

[MathFunctions.MultiClass.Add]::MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass+Add]::MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass]:Add:MultiplyAndAdd(10, 2, 3)
[MathFunctions.MultiClass]::Add.MultiplyAndAdd(10, 2, 3)

, но я всегда получаю варианты на

Unable to find type [MathFunctions.MultiClass.Add]

Я также искал метод в powershell через:

[MathFunctions.MultiClass] | get-member  -MemberType method    

но моего подкласса нет в списке.

Я знаю, что получаю к нему неправильный доступ.Я не могу понять, как получить доступ к подклассу из powershell.

Я вполне уверен, что к подклассам можно получить доступ, поскольку самый близкий пример: PowerShell IComparable с подклассами , но я нене вижу, как он это связал.

Спасибо

Ответы [ 2 ]

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

Чтобы объяснить путаницу более подробно:

Вы ошибочно подумали, что отношения класса-наследования должны быть отражены в полном имени (квалифицированного в пространстве имен) данного класса , поэтому высчитал, что поскольку класс Add является производным от класса MultiClass, MultiClass также должно быть отражено в полном имени типа.

В действительности, порождение классане имеет отношения к его полному названию ;все, что имеет значение, это пространство имен , в котором оно находится.Другими словами: , чтобы сформировать полное имя типа для любого типа (класса), используйте
<EnclosingNamespace>.<TypeName>
[1] , что в вашем случае означает:

 MathFunctions.Add

Использование этого в качестве литерала типа PowerShell - [MathFunctions.Add] - позволяет получить доступ к статическому методу MultiplyAndAdd() через ::, оператор доступа к статическому члену, как показано в вашем собственном ответе.


Кроме того, помните, что завершение табуляции может быть полезным , поскольку оно работает и с именами типов;в вашем случае ввод [Add<tab> расширится до [MathFunctions.Add, давая полное имя типа.(Если несколько доступных (общедоступных) имен типов начинаются с Add, возможно, вам придется нажимать клавишу табуляции несколько раз для циклического перехода между совпадениями.)


[1] Варианттребуется для доступа к вложенному классу , т. е. к классу, встроенному в другой класс:
<EnclosingNamespace>.<EnclosingTypeName>+<NestedTypeName>, например, если у вашего Add класса был вложенный класс с именем Inner:
MathFunctions.Add+Inner

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

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

В итоге я использовал dotPeek, чтобы разложить dll (теперь это было публично [blush]).

Код такой же, как и выше, а метод powershell - это просто имя подкласса:

[MathFunctions.Add]::MultiplyAndAdd(5,2,3)

, который дал ответ - не ошибка

...