Компилятор Roslyn ищет неправильную папку bin для vbc.exe
Мне действительно нравятся новые возможности языка VB14 в VS2015 (такие как?. Нотация и интерполяция строк). В нашем приложении WinForms (.Net 4.5) я использую кодированный кодер для запуска кода динамической отчетности на лету. К сожалению, это не поддерживает автоматически новые языковые функции.
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
Чтобы заставить его работать, я попытался добавить пакет nuget Roslyn codedom, но это порождает две проблемы.
Первая проблема заключается в том, что он ищет компилятор в неправильном месте \bin\debug\bin\roslyn\vbc.exe, тогда как процесс сборки фактически создает его в папке \bin\debug\roslyn\ . Может кто-нибудь сказать мне, как решить эту проблему, поскольку это не в состоянии моего развертывания сервера сборки?
Создание ручной копии папки roslyn (обходной путь) и размещение ее там, где ожидается, что codedom найдет ее, не является реальным решением, но возникает вторая проблема, связанная с импортом System.Web.HttpRequest и System.Web.HttpResponse., Но я не собираю какой-либо веб-связанный код (winforms). Так чего же это ждет?
1 ответ
Ничего не обещая, но у меня была похожая проблема, которая была исправлена путем включения этих строк (я обновляю как существующий проект) в 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')" />