我正在开发一个PoSh项目,该项目生成CSharp代码,然后Add-Type
将其存储到内存中。如何获取PowerShell添加类型使用添加类型
新类型使用通过Add-Type加载的磁盘DLL中的现有类型。
一切都很好,直到我真的尝试调用新类型的方法。下面是我在做什么的例子:运行上面的脚本
$PWD = "."
rm -Force $PWD\TestClassOne*
$code = "
namespace TEST{
public class TestClassOne
{
public int DoNothing()
{
return 1;
}
}
}"
$code | Out-File tcone.cs
Add-Type -OutputAssembly $PWD\TestClassOne.dll -OutputType Library -Path $PWD\tcone.cs
Add-Type -Path $PWD\TestClassOne.dll
$a = New-Object TEST.TestClassOne
"Using TestClassOne"
$a.DoNothing()
"Compiling TestClassTwo"
Add-Type -Language CSharpVersion3 -TypeDefinition "
namespace TEST{
public class TestClassTwo
{
public int CallTestClassOne()
{
var a = new TEST.TestClassOne();
return a.DoNothing();
}
}
}" -ReferencedAssemblies $PWD\TestClassOne.dll
"OK"
$b = New-Object TEST.TestClassTwo
"Using TestClassTwo"
$b.CallTestClassOne()
给出的最后一行出现以下错误:
异常调用“CallTestClassOne”和“0”的说法(S): “无法加载文件或程序集'TestClassOne,...' 或它的某个依赖项,系统找不到指定的文件。“ 在AddTypeTest.ps1:39字符:20 + $ b.CallTestClassOne < < < <() + CategoryInfo:NotSpecified:(:) [],MethodInvocationException + FullyQualifiedErrorId:DotNetMethodException
我在做什么错?
谢谢你。我认为Add-Type没有获得它所需的API可用性测试。 – 2010-04-19 12:08:24
它在这些位置查找,因为这是应用程序的(PowerShell的)基本目录 - [appdomain] :: CurrentDomain.BaseDirectory。除非你在PowerShell.exe的配置文件(不推荐)中添加专用探测路径,否则CLR加载器将在那里或在该位置的某些子分区中查找。 – 2010-04-19 17:20:49
@凯蒂,你说得对。然而,问题是为什么PowerShell试图加载程序集,即使程序集已经加载。奇怪的是:| – stej 2010-04-19 18:18:16