如何使用PowerShell通过字符串插值编译C#/VB代码?

如何使用PowerShell通过字符串插值编译C#/VB代码?,c#,.net,vb.net,powershell,C#,.net,Vb.net,Powershell,我使用的是PowerShell5.1.18362.752的Windows10.0.18363.959 当试图在PowerShell中编译C#或VB.NET代码时,如下所示: $Source = @' Imports Microsoft.VisualBasic Imports System Public NotInheritable Class MainClass Public Shared Sub Main() Console.WriteLine($"{Tr

我使用的是PowerShell5.1.18362.752的Windows10.0.18363.959

当试图在PowerShell中编译C#VB.NET代码时,如下所示:

$Source = @'
Imports Microsoft.VisualBasic
Imports System

Public NotInheritable Class MainClass

    Public Shared Sub Main()
        Console.WriteLine($"{True}")
    End Sub

End Class
'@ 

$vbType = Add-Type -TypeDefinition $Source `
                   -CodeDomProvider (New-Object Microsoft.VisualBasic.VBCodeProvider) `
                   -PassThru `
                   -ReferencedAssemblies "Microsoft.VisualBasic.dll", `
                                         "System.dll" `
                                         | where { $_.IsPublic }

[MainClass]::Main()

$Console = [System.Console]
$Console::WriteLine("Press any key to exit...")
$Console::ReadKey($true)
Exit(0)
我收到一个编译器错误,因为用于字符串插值的“$”字符:

C:\Users\Administrador\AppData\Local\Temp\oshdpbp1\oshdpbp1.0.vb(12):>>>Console.WriteLine($“{1}”)

我知道我可以使用String.Format()函数来代替,但我想知道这个问题是否可以在不修改原始VB.NET代码的情况下解决(当然它是在Visual Studio上编译的)


请注意,字符串插值是在VB14中添加的。可能我缺少如何指定正确的VB编译器版本,我不知道如何使用PowerShell进行指定。

VBCodeProvider有一个带
IDictionary
参数的,该参数允许您指定编译器版本

这可能有效,但我现在无法测试:

$provOptions = [System.Collections.Generic.Dictionary[string,string]]::new()
$provOptions['CompilerVersion'] = 'v14.0'

$vbType = Add-Type -TypeDefinition $Source `
                   -CodeDomProvider (New-Object Microsoft.VisualBasic.VBCodeProvider $provOptions) `
                   -PassThru `
                   -ReferencedAssemblies "Microsoft.VisualBasic.dll", `
                                         "System.dll" `
                                         | where { $_.IsPublic }

VBCodeProvider
具有一个带
IDictionary
参数的,可用于指定编译器版本

这可能有效,但我现在无法测试:

$provOptions = [System.Collections.Generic.Dictionary[string,string]]::new()
$provOptions['CompilerVersion'] = 'v14.0'

$vbType = Add-Type -TypeDefinition $Source `
                   -CodeDomProvider (New-Object Microsoft.VisualBasic.VBCodeProvider $provOptions) `
                   -PassThru `
                   -ReferencedAssemblies "Microsoft.VisualBasic.dll", `
                                         "System.dll" `
                                         | where { $_.IsPublic }

Console.WriteLine($“{1}”)
本身没有问题-错误消息是什么?@Andrew Morton,正如我解释的,这是由于“$”字符引起的。错误消息为:“不是有效字符”。如果我删除“$”字符,那么它编译时不会出错。是否需要从powershell的插值中转义$(即使用backtick
`$“{True}”
),或者它肯定来自vb编译器?@pinkfloydx33它肯定来自vb编译器。行
控制台没有问题。WriteLine($“{1}”)
因此-错误消息是什么?@Andrew Morton,正如我解释的,这是由于“$”字符造成的。错误消息为:“不是有效字符”。如果我删除“$”字符,那么它编译时不会出错。是否需要从powershell的插值中转义$(即使用backtick
`$“{True}”
),或者它肯定来自vb编译器?@pinkfloydx33它肯定来自vb编译器。谢谢回答。14.0是所需的VB语言版本,但不是(vbc.exe)编译器版本,它不工作,它表示无法找到编译器可执行文件。我发现一个值“v4.0”是可以接受的,但它没有编译(我得到了“$”字符的语法错误),而且这个版本号很奇怪,因为我最新的vbc.exe版本是3.8.0.5。可能该版本指的是.NET Framework目标版本,但是如果我尝试指定“v4.5”、“v4.6”、“v4.7.1”或“v4.8”及类似版本,则会出现此注释开头提到的错误。我也试过了。msbuild.exe的编号不确定如何在PowerShell脚本中实现下一个,但理论上我可以在VBC.exe命令行编译器选项中指定VB lang版本:。这可以通过.NET中System.CodeDom.Compiler.CompilerParameters类的CompilerOptions属性进行管理,但是我甚至在指定“-langversion:latest”和“-langversion:default”时出现了一个错误,它表示“latest”和“default”(以及与“10”或“11”不同的任何内容)不是“langversion”选项的有效值。。。我在VB16@mklement0说得好,我已经解决了。或者,有效的方法语法应该是:
[SomeType]::new(arg1,…)
谢谢您的回答。14.0是所需的VB语言版本,但不是(vbc.exe)编译器版本,它不工作,它表示无法找到编译器可执行文件。我发现一个值“v4.0”是可以接受的,但它没有编译(我得到了“$”字符的语法错误),而且这个版本号很奇怪,因为我最新的vbc.exe版本是3.8.0.5。可能该版本指的是.NET Framework目标版本,但是如果我尝试指定“v4.5”、“v4.6”、“v4.7.1”或“v4.8”及类似版本,则会出现此注释开头提到的错误。我也试过了。msbuild.exe的编号不确定如何在PowerShell脚本中实现下一个,但理论上我可以在VBC.exe命令行编译器选项中指定VB lang版本:。这可以通过.NET中System.CodeDom.Compiler.CompilerParameters类的CompilerOptions属性进行管理,但是我甚至在指定“-langversion:latest”和“-langversion:default”时出现了一个错误,它表示“latest”和“default”(以及与“10”或“11”不同的任何内容)不是“langversion”选项的有效值。。。我在VB16@mklement0说得好,我已经解决了。或者,有效的方法语法应该是:
[SomeType]::new(arg1,…)