以下代码创建一个内存类型,找到其程序集,然后尝试添加引用第一个类型的另一个类型:
Add-Type -TypeDefinition 'namespace MyNamespace { public class c {}}'
$assembly =
$([System.AppDomain]::CurrentDomain.
GetAssemblies().
GetTypes() |
? {$_.Namespace -eq 'MyNamespace' } |
% Assembly |
Select-Object -Unique -First 1 )
Add-Type -TypeDefinition 'namespace MyNamespace {public class d : c {}}' `
-ReferencedAssemblies $assembly
尝试失败并出现错误
Add-Type: C:\repro.ps1:12
Line |
12 | Add-Type -TypeDefinition 'namespace MyNamespace {public class d : c { …
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| The value cannot be an empty string. (Parameter 'path')
这表明Add-Type
正在寻找一条可能不存在的路径,因为程序集只存在于内存中。
是否可以添加引用仅内存类型的类型?
什么有效
以下方法有效,但要求程序集存在于文件系统中:
Remove-Item .\c.dll,.\d.dll -ErrorAction SilentlyContinue
Add-Type `
-TypeDefinition 'namespace MyNamespace { public class c {}}' `
-OutputAssembly .\c.dll
Add-Type -Path .\c.dll
[MyNamespace.c]::new()
Add-Type -TypeDefinition 'namespace MyNamespace {public class d : c {}}' `
-ReferencedAssemblies .\c.dll `
-OutputAssembly .\d.dll
Add-Type -Path .\d.dll
[MyNamespace.d]::new()