2013-11-12 2 views
1

Я пытаюсь разобрать код VB.Net с помощью Roslyn, но он продолжает бросать InvalidProgramException (Jit-компилятор обнаружил ограничение ..). Аналогичный код отлично работает с C#.InvalidProgramException при попытке разбора кода VB.Net с Roslyn

Это мой код:

var source = "Public Module Module1 \r\n Public Sub X() \r\n End Sub \r\n End Module"; 
var syntaxTree = Roslyn.Compilers.VisualBasic.SyntaxTree.ParseText(source); 
var compilation = Roslyn.Compilers.VisualBasic.Compilation.Create("MyCompilation", syntaxTrees: new[] {syntaxTree}); 
var semanticModel = compilation.GetSemanticModel(syntaxTree); 

Исключение брошено на последней строке.

Update Вот трассировки стека:

System.InvalidProgramException: JIT Compiler encountered an internal limitation. 
HResult: -2146233030 
    в Roslyn.Compilers.VisualBasic.SeparatedSyntaxList`1..ctor(SyntaxNode node, Int32 index) 
    в Roslyn.Compilers.VisualBasic.CompilationUnitSyntax.get_Members() 
    в Roslyn.Compilers.VisualBasic.DeclarationTreeBuilder.VisitCompilationUnit(CompilationUnitSyntax node) 
    в Roslyn.Compilers.VisualBasic.CompilationUnitSyntax.Accept[TResult](SyntaxVisitor`1 visitor) 
    в Roslyn.Compilers.VisualBasic.SyntaxVisitor`1.Visit(SyntaxNode node) 
    в Roslyn.Compilers.VisualBasic.DeclarationTreeBuilder.ForDeclaration(SyntaxNode node) 
    в Roslyn.Compilers.VisualBasic.DeclarationTreeBuilder.ForTree(SyntaxTree tree, ReadOnlyArray`1 rootNamespace, String scriptClassName, Boolean isSubmission) 
    в Roslyn.Compilers.VisualBasic.Compilation.ForTree(SyntaxTree tree, CompilationOptions options, Boolean isSubmission) 
    в Roslyn.Compilers.VisualBasic.Compilation._Closure$__11._Lambda$__59() 
    в System.Lazy`1.CreateValue() 
    в System.Lazy`1.LazyInitValue() 
    в System.Lazy`1.get_Value() 
    в Roslyn.Compilers.VisualBasic.DeclarationTable.GetLatestRootDeclarationIfAny(Boolean includeEmbedded) 
    в Roslyn.Compilers.VisualBasic.DeclarationTable.GetMergedReferenceDirectives() 
    в System.Lazy`1.CreateValue() 
    в System.Lazy`1.LazyInitValue() 
    в System.Lazy`1.get_Value() 
    в Roslyn.Compilers.VisualBasic.DeclarationTable.get_ReferenceDirectives() 
    в Roslyn.Compilers.VisualBasic.Compilation.get_ReferenceDirectives() 
    в Roslyn.Compilers.CommonAssemblyManager`3.GetCompilationReferences(TCompilation compilation, DiagnosticBag diagnostics, List`1 references, IDictionary`2& boundReferenceDirectives, List`1& referenceDirectiveLocations) 
    в Roslyn.Compilers.CommonAssemblyManager`3.ResolveMetadataReferences(TCompilation compilation, List`1 references, IDictionary`2& boundReferenceDirectiveMap, ReadOnlyArray`1& boundReferenceDirectives, List`1 assemblies, List`1 modules, DiagnosticBag diagnostics) 
    в Roslyn.Compilers.VisualBasic.Compilation.AssemblyManager.CreateSourceAssemblyForCompilation(Compilation compilation, Dictionary`2& referencedAssembliesMap, Dictionary`2& referencedModulesMap, IDictionary`2& boundReferenceDirectiveMap, ReadOnlyArray`1& boundReferenceDirectives, SourceAssemblySymbol& assemblySymbol, DiagnosticBag& diagnostics) 
    в Roslyn.Compilers.VisualBasic.Compilation.AssemblyManager.CreateSourceAssemblyForCompilation(Compilation compilation) 
    в Roslyn.Compilers.VisualBasic.Compilation.EnsureSourceAssemblyCreated() 
    в Roslyn.Compilers.VisualBasic.Compilation.get_SourceAssembly() 
    в Roslyn.Compilers.VisualBasic.Compilation.get_Assembly() 
    в Roslyn.Compilers.VisualBasic.Compilation.get_SourceModule() 
    в Roslyn.Compilers.VisualBasic.Compilation.GetSemanticModel(SyntaxTree syntaxTree) 
+0

Я не получаю исключения из этого кода. Не могли бы вы разместить полную трассировку стека? – svick

+0

Обновлено вопрос – ulu

+0

Я ничего не вижу в 'SeparatedSyntaxList \' 1..ctor', который может вызвать такое исключение. Вы можете попробовать [сообщать об этом как об ошибке] (https://connect.microsoft.com/VisualStudio/). – svick

ответ

1

Это исключение, как правило, указывает на то, что программа сама коррумпирована. Если вы можете предоставить файл аварийного дампа, сделайте это.

Также убедитесь, что ваши сборки не были повреждены каким-либо образом. Все бинарные файлы Roslyn, которые мы отправляем, имеют цифровую подпись, поэтому проверьте, имеет ли ваша Roslyn.Compilers.VisualBasic.dll действительную подпись. Найдите DLL, перейдите в раздел «Свойства файла» в проводнике Windows, вкладке «Цифровые подписи» и нажмите «Детали». Убедитесь, что вы видите «подпись в порядке».

+0

Я могу запустить этот код как консольное приложение без каких-либо проблем. Однако проблема возникает, когда я использую этот код в веб-приложении (используя сервер WebDev). Может быть, это какая-то несовместимость? У меня нет такой проблемы, когда я использую компилятор CSharp. – ulu

0

Оказалось, что исключение выбрасывается, когда я использую код только на своем веб-сайте, а затем веб-сайт работает либо на VisualStudio Development Server, либо на IIS Express. Также запускайте его через TestDriven.net и Gallio (возможно, это просто старые версии). Код отлично работает с консольным приложением или IIS.

Я все еще считаю это ошибкой, так как аналогичный код, использующий компилятор CSharp, работает отлично.

Смежные вопросы