5

我正在关注此处的文档设置 Microsoft C# 开发,在此步骤构建 C# vSphere DLL我在开发人员命令提示符中得到以下信息:

C:\Users\user\Downloads\VMware-vSphereSDK-6.5.0-4571253\SDK\vsphere-ws\dotnet\bin>build.bat
        1 file(s) copied.
Fixing HttpNfcLeaseInfo type, adding missing leaseState property
Generating VimService.cs
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.6.1055.0]
Copyright (c) Microsoft Corporation.  All rights reserved.

Generating files...
C:\Users\user\Downloads\VMware-vSphereSDK-6.5.0-4571253\SDK\vsphere-ws\dotnet\bin\VimService.cs
Compiling original VimService.dll
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.6.1055.0]
Copyright (c) Microsoft Corporation.  All rights reserved.

Generating XML serializers...
C:\Users\user\Downloads\VMware-vSphereSDK-6.5.0-4571253\SDK\vsphere-ws\dotnet\bin\VimServiceSerializers.cs
        1 file(s) copied.
Optimizing VimService.cs by stripping serializer hint attributes.
Compiling optimized VimService.dll
FAILED

看起来build.bat它似乎在这条线上失败了:

echo Compiling optimized VimService.dll
csc /t:library /out:Vim25Service.dll VimService.cs VimServiceSerializers.cs >nul || goto ERROR

如果我csc /t:library /out:Vim25Service.dll VimService.cs VimServiceSerializers.cs手动运行,我会得到以下信息:

C:\Users\user\Downloads\VMware-vSphereSDK-6.5.0-4571253\SDK\vsphere-ws\dotnet\bin>csc /t:library /out:Vim25Service.dll VimService.cs VimServiceSerializers.cs
Microsoft (R) Visual C# Compiler version 1.3.1.60616
Copyright (C) Microsoft Corporation. All rights reserved.

VimServiceSerializers.cs(32548,98): error CS8078: An expression is too long or complex to compile

我也试过VS2017:

C:\Users\user\Downloads\VMware-vSphereSDK-6.5.0-4571253\SDK\vsphere-ws\dotnet\bin>csc /t:library /out:Vim25Service.dll VimService.cs VimServiceSerializers.cs
Microsoft (R) Visual C# Compiler version 2.0.0.61213
Copyright (C) Microsoft Corporation. All rights reserved.

VimServiceSerializers.cs(31372,109): error CS8078: An expression is too long or complex to compile

一个需要注意的行为,VimServiceSerializers.cs(#####,##)每次的行和列都不一样。

谷歌搜索错误 CS8078,发现这是编译器堆栈空间不足的问题。https://stackoverflow.com/a/8160109/6656422

如何成功编译 VmWare 的代码?

4

2 回答 2

3

我想到了。序列化程序 CS 文件有很长的不间断的if ... else if ... else if ...子句。编译器必须一次处理整个 if/else 表达式,这会导致它耗尽堆栈空间。

幸运的是,这些else ifs 中的每个分支都以一条return语句结束。这使得所有的else ifs 在功能上等同于独立的if语句,这些语句是独立解析的。

在多个位置进行此替换后,文件将编译。这是我修改后的 VimServiceSerializers.cs:https ://1drv.ms/u/s!Al6mzY0CpY7EnHqBRDyg-z0ctrjk

于 2017-01-26T01:06:03.737 回答
2

通过将 if ...else 拆分为单独的 if 语句给出的答案是一种解决方案。另一个选项是检查用于编译代码的 C# 编译器的版本。我已经看到与.NET 4.5、4.6 捆绑的 csc.exe 可以编译此类代码而不会产生任何错误。但 Roslyn .NET 编译器无法编译此类代码并生成 CS8078 错误。因此,如果您不想修改代码,另一种选择是更改 C# 编译器。例如下面的 csc.exe 可以编译这样的代码 -

 C:\Windows\Microsoft.NET\Framework\v4.0.30319>csc.exe /version
Microsoft (R) Visual C# Compiler version 4.6.1055.0
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.
于 2019-04-12T13:16:00.080 回答