添加类型PowerShell 2.0无法找到方法

时间:2010-09-22 11:19:58

标签: c# powershell-v2.0 add-type

我已经创建了一个c#类,我正在尝试使用add-Type在PowerShell中运行。 我引用了一些自己的程序集,其中一些来自.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 个答案:

答案 0 :(得分:1)

您的方法是静态的,但您尝试通过实例调用它。

$MyProblemCollection = new-Object ComponentSubtypeMustMatchTemplate

创建ComponentSubtypeMustMatchTemplate新实例

$MyProblemCollection.Validate()

Validate引用的对象上调用名为$MyProblemCollection实例方法。但是,由于没有名为Validate的实例方法,因此调用失败。

您可以使方法非静态(如果它们要在对象中保持状态,您可以这样做),或者您可以使用用于调用静态方法的不同PowerShell语法:

$result = [ComponentSubtypeMustMatchTemplate]::Validate()

记住(如果保持这些静态),设置静态属性意味着在同一进程中查询该属性的任何内容都将获得该值。如果您持有州,那么我建议从每个声明中删除static