Создание библиотеки DLL vSphere завершается неудачно с CS8078: выражение слишком длинное или сложное для компиляции

Я следую документации, приведенной здесь. Настройка для разработки на Microsoft C#, и на этом этапе Создание библиотек DLL C# vSphere я получаю в командной строке разработчика следующее:

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, обнаружил, что это проблема с компилятором, исчерпывающим пространство стека. /questions/11493680/oshibka-sborki-vyirazhenie-slishkom-dlinnoe-ili-slozhnoe-dlya-kompilyatsii/11493687#11493687

Как мне успешно скомпилировать код VmWare?

1 ответ

Решение

Я понял. Файл CS сериализатора имеет длинные непрерывные отрезки if ... else if ... else if ... статьи. Компилятору приходится иметь дело со всем выражением if/else сразу, что приводит к тому, что ему не хватает места в стеке.

К счастью, каждая ветвь в этих else ifс заканчивается return заявление. Это делает все else ifс функционально эквивалентным просто независимым if заявления, которые разбираются самостоятельно.

После выполнения этой замены в нескольких местах файл компилируется. Вот мои модифицированные VimServiceSerializers.cs: https://1drv.ms/u/s!Al6mzY0CpY7EnHqBRDyg-z0ctrjk

Ответ, полученный путем разделения if... else на отдельные операторы if, является одним из решений. Другой вариант - проверить версию компилятора C#, которая используется для компиляции кода. Я видел, что csc.exe в комплекте с.NET 4.5, 4.6 может компилировать такой код без каких-либо ошибок. Но компилятор 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.
Другие вопросы по тегам