Создание библиотеки 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.