2015-10-15 11 views
0

Мне очень нравятся новые функции языка VB14 в VS2015 (например, обозначение и интерполяция строк). В нашем приложении WinForms (.Net 4.5) я использую компилятор codedom для запуска динамического кода отчетности на лету. К сожалению, это не автоматически поддерживает новые функции языка.Компилятор Roslyn, находящийся в неправильной папке bin для vbc.exe

Imports System.CodeDom.Compiler 

Namespace MAF.DB.BusinessObject.ReportService 
    Public Class VBReportCompiler 
     Implements IReportCompiler 

     Private ReadOnly ApplicationPath As String 

     ''' <summary> 
     ''' Create a report compiler with a reference to the location of the Wingman dlls. These need 
     ''' to be referenced in the compilation, but the location differs between web and windows. 
     ''' </summary> 
     ''' <param name="ApplicationPath">Path to the binary folder</param> 
     Public Sub New(ApplicationPath As String) 
     Me.ApplicationPath = ApplicationPath 
     End Sub 

     Public Function Compile(convertedSourceCode As String, Optional ByRef reporter As IValidationReporter = Nothing, 
           Optional report As IBusinessObject = Nothing) As Object Implements IReportCompiler.Compile 
     If reporter Is Nothing Then reporter = IOC.Dependency.Resolve(Of IValidationReporter)() 
     Dim result As Object = Nothing 
     Try 
      If convertedSourceCode Is Nothing Then 
       reporter.Add(report, "Report definition missing or blank") 
      Else 
       Dim params As New CompilerParameters With { 
        .GenerateExecutable = False, ' Generate a DLL, not and EXE executable. 
        .GenerateInMemory = True,  ' Generate the assembly in memory, don't save to a file 
        .IncludeDebugInformation = True 
       } 

       params.TempFiles.KeepFiles = False ' don't keep temporary source files. 

       ' Add a reference to necessary strong-named assemblies. 
       With params.ReferencedAssemblies 
        .Add("Microsoft.VisualBasic.dll") 
        .Add("System.dll") 
        .Add("System.Core.dll") 
        .Add("System.Data.dll") 'Allows use in report of ADO data types 
        .Add("System.Data.DataSetExtensions.dll") 'Allows LINQ on DataTables 
        .Add("System.Drawing.dll") 'Allows access in report of GDI+ basic graphics functionality such as datatable 
        .Add("System.Xml.dll") 
        'Add References to required Wingman assemblies 
        .Add(IO.Path.Combine(ApplicationPath, "MAF.DB.dll")) 'Allows use in report of Data Access & Business Object functions and properties 
        .Add(IO.Path.Combine(ApplicationPath, "MAF.SharedClasses.dll")) 
        .Add(IO.Path.Combine(ApplicationPath, "DB.Foundation.dll")) 
        .Add(IO.Path.Combine(ApplicationPath, "MAF.Tracer.dll")) ' allows use in report of standard error messages 
       End With 

       ' Create the VB compiler. 
       Dim provider = New VBCodeProvider() 'Use the current .Net Framework 
       Dim compRes = provider.CompileAssemblyFromSource(params, convertedSourceCode) 

       ' Check whether we have any compile errors. 
       For Each compileError As CompilerError In compRes.Errors 
        reporter.Add(report, String.Format("Line {0}: {1}", compileError.Line, compileError.ErrorText)) 
       Next 

       If reporter.Valid Then result = compRes.CompiledAssembly.CreateInstance("ReportCompiler") 
      End If 
     Catch ex As Exception 
      reporter.Add(report, "Unknown Error: " & ex.Message) 
     End Try 

     If Not reporter.Valid Then Return Nothing 
     Return result 
     End Function 
    End Class 

Для того, чтобы заставить его работать, я пытался добавить CodeDOM NuGet пакет Roslyn но порождает две проблемы.

Первая проблема заключается в том, что он ищет компилятор в неправильном месте \ bin \ debug \ bin \ roslyn \ vbc.exe, тогда как процесс сборки фактически создает его в папке \ bin \ debug \ roslyn \. Может ли кто-нибудь сказать мне, как разрешить это, поскольку это не позволяет выполнить развертывание сервера сборки?

Выполнение ручной копии папки roslyn (work-around) и ее размещение там, где codedom ожидает, что это не настоящее решение, но это вызывает вторую проблему, которая ожидает импорт System.Web.HttpRequest и системы .Web.HttpResponse. Но я не компилирую какой-либо веб-код (winforms). Так почему он этого ожидает?

ответ

0

Не обещаю ничего, но у меня была аналогичная проблема, которая была исправлена ​​включением этих строк (я обновляю- ся как существующий проект) в website.vbproj. Они могут быть включены nuget ...

<Import Project="..\Solution\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props" Condition="Exists('..\Solution\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" /> 
<Import Project="..\Solution\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\Solution\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props')" />