【问题标题】:How to compile C# / VB code with string interpolation using PowerShell?如何使用 PowerShell 编译带有字符串插值的 C#/VB 代码?
【发布时间】:2020-12-25 12:36:11
【问题描述】:

我在 Windows 10.0.18363.959 上使用 PowerShell 5.1.18362.752

当尝试像这样在 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。

【问题讨论】:

  • Console.WriteLine($"{1}") 这行没有任何问题 - 错误信息是什么?
  • @Andrew Morton 正如我解释的那样,这是由于“$”字符所致。错误消息是:“不是有效字符”。如果我删除“$”字符,那么它编译时不会出错。
  • 你需要从 powershell 的插值中转义 $ (即使用反引号 `$"{True}" )还是它肯定来自 vb 编译器?
  • @pinkfloydx33 肯定来自 vb 编译器。

标签: c# .net vb.net powershell


【解决方案1】:

VBCodeProvider 有一个 constructor 和一个 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 }

【讨论】:

  • 感谢您的回答。 14.0是需要的VB语言版本而不是(vbc.exe)编译器版本,它不起作用,它说找不到编译器可执行文件。我发现“v4.0”的值被接受,但它没有编译(我得到“$”字符的语法错误),而且无论如何那个版本号很奇怪,因为我最新的 vbc.exe 版本是 3.8.0.5。也许版本指的是 .NET Framework 目标版本,但是如果我尝试指定“v4.5”、“v4.6”、“v4.7.1”或“v4.8”,则会收到此评论开头提到的错误"和类似的版本。我也试过ver。我的 msbuild.exe 的数量
  • 不确定如何在 PowerShell 脚本中实现 next,但理论上我可以在 VBC.exe 命令行编译器选项中指定 VB lang 版本:docs.microsoft.com/en-us/dotnet/visual-basic/reference/…。这可以通过 .NET 中 System.CodeDom.Compiler.CompilerParameters 类的 CompilerOptions 属性进行管理,但是即使指定 '-langversion:latest' 和'-langversion:default',它说“最新”和“默认”(以及与“10”或“11”不同的任何内容)不是“langversion”选项的有效值......我在 VB16
  • @mklement0 好点,我已经解决了。或者,一个有效的方法语法是:[SomeType]::new( arg1, ... )
猜你喜欢
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2020-09-20
  • 2018-05-09
  • 2015-09-28
  • 2022-03-24
相关资源
最近更新 更多