Я создал класс 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
хмм нвм, это спонтанно сработало! странно, НО я счастлив! =) * * Один тысяча двадцать-шесть