Add-Type PowerShell 2.0 не может найти метод - PullRequest
1 голос
/ 22 сентября 2010

Я создал класс c #, который пытаюсь запустить в PowerShell с помощью add-Type. У меня есть несколько моих собственных сборок, на которые есть ссылки, и некоторые из .net4. Я использую свой собственный хост PowerShell, потому что сборки, на которые я ссылаюсь, сделаны на платформе .net4, а консоль PowerShell пока не поддерживает это.

Вот пример скрипта, который я пытаюсь запустить:

$Source = @"
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using MyOwn.Components.Utilities;
using MyOwn.Components;
using MyOwn.Entities;

public class ComponentSubtypeMustMatchTemplate
{

    public static Guid ProblemId
    {
        get { return new Guid("{527DF518-6E91-44e1-B1E4-98E0599CB6B2}"); }
    }

    public static ProblemCollection Validate()
    {

 SoftwareStructureEntityContainer softwareEntityStructure = new SoftwareStructureEntityContainer();

        if (softwareEntityStructure == null)
        {
            throw new ArgumentNullException("softwareStructure");
        }

        ProblemCollection problems = new ProblemCollection();

        foreach (var productDependency in softwareEntityStructure.ProductDependencies)
        {......

        return problems;
    }
}
"@

$refs = @("d:\Projects\MyOwn\bin\MyOwn.Components.dll",
"d:\Projects\MyOwn\bin\MyOwn.Entities.dll",
"d:\Projects\MyOwn\bin\MyOwn.OperationalManagement.dll",
"c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Core.dll",
"c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.Entity.dll",
"c:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.dll")

Add-Type -ReferencedAssemblies $refs -TypeDefinition $Source


$MyProblemCollection = new-Object ComponentSubtypeMustMatchTemplate
$MyProblemCollection.Validate()

Теперь, когда я запускаю это, я получаю эту ошибку:

{"Ошибка вызова метода, поскольку [ComponentSubtypeMustMatchTemplate] не содержит метод с именем« Validate »."}

Я также пробовал последний бит по-разному (нашел много разных примеров того, как это сделать), но все они, похоже, дают одну и ту же ошибку. Я действительно понятия не имею, как заставить это работать, и я не могу найти ни одного примера на что-то подобное.

Во второй заметке (когда я это исправлю) мне было интересно, можно ли было просто загрузить файл .cs вместо того, чтобы поместить код c # в скрипт. было бы лучше читать и быть более понятным.

Я пытался проверить, могу ли я увидеть методы с Get-Member -static, например:

$MyProblemCollection = New-Object ComponentSubtypeMustMatchTemplate
$MyProblemCollection | Get-Member -Static

И он видит метод там:

   TypeName: ComponentSubtypeMustMatchTemplate

Name            MemberType Definition                                           
----            ---------- ----------                                           
Equals          Method     static bool Equals(System.Object objA, System.Obje...
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, Sy...
Validate        Method     static MyOwn.ComponentSubtypeMustMatchTemplate...  <--
ProblemId       Property   static System.Guid ProblemId {get;}         

Так почему же это не работает?


@ Philip в моем сценарии не имеет значения, является ли это статической или нестатической причиной, она всегда будет запущена один раз, и результаты будут использованы моей программой. Но странно то, что это работает, если я использую статический синтаксис (за исключением того, что я вообще не получаю результатов) и если я использую нестатический синтаксис, я получу ту же ошибку. Я также пробовал скрипт в другой консоли PowerShell, которую я нашел на веб-сайтах, и там я получаю совершенно другую ошибку:

 PS C:\temp.
ps1
The following exception occurred while retrieving member "Validate": "Could not
 load file or assembly 'MyOwn.Entit
ies, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fc80acb30cba5fab' or one
of its dependencies. The system cannot find the file specified."
At D:\Projects\temp.ps1:145 char:30
+ $MyProblemCollection.Validate <<<< ()
    + CategoryInfo          : NotSpecified: (:) [], ExtendedTypeSystemExceptio
   n
    + FullyQualifiedErrorId : CatchFromBaseGetMember

хмм нвм, это спонтанно сработало! странно, НО я счастлив! =) * * Один тысяча двадцать-шесть

1 Ответ

1 голос
/ 22 сентября 2010

Ваш метод статичен, но вы пытаетесь вызвать его через экземпляр.

$MyProblemCollection = new-Object ComponentSubtypeMustMatchTemplate

Создает новый экземпляр из ComponentSubtypeMustMatchTemplate.

$MyProblemCollection.Validate()

Вызывает метод instance с именем Validate для объекта, на который ссылается $MyProblemCollection.Однако, поскольку нет метода экземпляра с именем Validate, вызов завершается неудачей.

Вы можете либо сделать методы нестатичными (что вы бы сделали, если бы они собирались сохранить состояние в объекте), либо вы можетеиспользуйте другой синтаксис powershell, используемый для вызова статического метода:

$result = [ComponentSubtypeMustMatchTemplate]::Validate()

Помните (если вы сохраняете эти статические значения), что установка статического свойства означает, что любое обращение к этому свойству в том же процессе получит это значение.Если вы держите состояние, то я бы посоветовал удалить static из каждого объявления.

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