2014-10-14 1 views
2

Я занимаюсь некоторыми базовыми материалами Roslyn и сталкиваюсь с тем, что кажется проблемой моно совместимости. Хотел убедиться, что я не делаю что-то неправильно и не слышу чужой опыт. Я использую Roslyn из Microsoft.CodeAnalysis nuget, версия 0.7.4091001-beta (последняя).Создание Roslyn MetadataFileReference бомбы на mono/Linux

var mscorlib = new MetadataFileReference(typeof(object).Assembly.Location); 
var compilation = CSharpCompilation.Create("Temp", new SyntaxTree[0], new[] { mscorlib }); 
compilation.GetAssemblyOrModuleSymbol(mscorlib); 

Хотя это работает на платформе Microsoft .NET, на моно на Linux последняя строка производит следующее исключение:

[ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: Absolute path expected. 
Parameter name: fullPath 
    at Microsoft.CodeAnalysis.CommonReferenceManager`2[Microsoft.CodeAnalysis.CSharp.CSharpCompilation,Microsoft.CodeAnalysis.CSharp.Symbols.AssemblySymbol].ResolveMetadataReferences (Microsoft.CodeAnalysis.CSharp.CSharpCompilation compilation, System.Collections.Immutable.ImmutableArray`1& references, IDictionary`2& boundReferenceDirectiveMap, System.Collections.Immutable.ImmutableArray`1& boundReferenceDirectives, System.Collections.Immutable.ImmutableArray`1& assemblies, System.Collections.Immutable.ImmutableArray`1& modules, Microsoft.CodeAnalysis.DiagnosticBag diagnostics) [0x00000] in <filename unknown>:0 
    at Microsoft.CodeAnalysis.CSharp.CSharpCompilation+ReferenceManager.CreateAndSetSourceAssemblyFullBind (Microsoft.CodeAnalysis.CSharp.CSharpCompilation compilation) [0x00000] in <filename unknown>:0 
    at Microsoft.CodeAnalysis.CSharp.CSharpCompilation+ReferenceManager.CreateSourceAssemblyForCompilation (Microsoft.CodeAnalysis.CSharp.CSharpCompilation compilation) [0x00000] in <filename unknown>:0 
    at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetBoundReferenceManager() [0x00000] in <filename unknown>:0 
    at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetAssemblyOrModuleSymbol (Microsoft.CodeAnalysis.MetadataReference reference) [0x00000] in <filename unknown>:0 
    at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CommonGetAssemblyOrModuleSymbol (Microsoft.CodeAnalysis.MetadataReference reference) [0x00000] in <filename unknown>:0 
    at Microsoft.CodeAnalysis.Compilation.GetAssemblyOrModuleSymbol (Microsoft.CodeAnalysis.MetadataReference reference) [0x00000] in <filename unknown>:0 
    at playground2.MainClass.Main (System.String[] args) [0x00000] in <filename unknown>:0 

Там, очевидно, какой-то путь разбора Linux/Windows, грусти здесь происходит. Моим текущим решением является создание ссылки на corlib таким образом:

var mscorlibMetadata = AssemblyMetadata.CreateFromImageStream(new FileStream(typeof(object).Assembly.Location, FileMode.Open, FileAccess.Read)); 
var mscorlib = new MetadataImageReference (mscorlibMetadata); 

Кто-нибудь знает об этом?

ответ

1

Это ошибка в Roslyn.

Вы можете отправить им запрос на извлечение, чтобы исправить PathUtilities.GetPathKind, чтобы знать пути в стиле Linux, проверив Path.DirectorySeparatorChar.

+0

Спасибо за то, что указали мне в направлении проблемного кода, я отправлю PR в ближайшие несколько дней. –

+1

Для всех, кому это интересно, вот PR: http://roslyn.codeplex.com/SourceControl/network/forks/rojansky/roslyn/contribution/7576 –