Компиляция VB.NET с помощью bat-файла

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Компиляция VB.NET с помощью bat-файла

Сообщение Qwertiy » 07.06.2013 (Пт) 17:03

Bat-файл помещается в каталог с файлами кода.
При запуске он находит самый новый компилятор VB.NET (по возможности 64-битный) и запускает компиляцию кода.
Естественно возможны случаи, когда скомпилировать не удастся. Например, если использован более новый синтаксис, чем поддерживается имеющимся компилятором; или когда структура проекта слишком сложна.
Однако мне уже несколько раз приходилось компилировать код на компьютерах, где нет VS, так что bat'ник достаточно полезен.

Код: Выделить всё
@echo off

cd /d "%~dp0"

for /d %%f in (%windir%\Microsoft.NET\Framework\v*, %windir%\Microsoft.NET\Framework64\v*) do if exist %%f\vbc.exe set vbc="%%f\vbc.exe"
if "%vbc%"=="" goto novbc
echo Compiler: %vbc%

if exist Form1.vb set main="/main:Form1" "/target:winexe"
echo Special: %main%
echo.

rem %vbc% /debug- /optimize+ /imports:System.Windows.Forms /imports:System.Drawing /imports:System.Collections.Generic /imports:System.Text /imports:System.Text.RegularExpressions /imports:System.Diagnostics /imports:System.IO %main% /recurse:*.vb
%vbc% /debug- /optimize+ /imports:System.Windows.Forms /imports:System.Drawing /imports:System.Collections.Generic /imports:System.Text /imports:System.Text.RegularExpressions /imports:System.Diagnostics /imports:System.IO %main% *.vb

goto end

:novbc
color c
echo No one VB.NET compiler was found

:end
pause
color

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Компиляция VB.NET с помощью bat-файла

Сообщение Admiralisimys » 05.07.2013 (Пт) 21:47

Qwertiy хороший подход (х64 вариант задействован и номера версий не захардкоджены), я по аналогии тоже когда-то так собирал
Admiralisimys писал(а):
Код: Выделить всё
echo Это содержимое бат файла, содержащего как исходный код (в данном случаи на VB.NET)
echo так и параметры для компиляции (сборки) последнего
@echo off
SET FileName=MyProgram

IF EXIST %FileName%.exe goto RunEXE
IF EXIST %FileName%.vb goto compileVB

echo ' A "Hello World!" program in Visual Basic. >%FileName%.vb
echo Module Hello >>%FileName%.vb
echo    Sub Main() >>%FileName%.vb
echo       MsgBox("Hello World!")   ' Display message on computer screen. >>%FileName%.vb
echo    End Sub >>%FileName%.vb
echo End Module >>%FileName%.vb

goto compileVB

:compileVB
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v3.5 goto net35   
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727 goto net20
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322 goto net11
if exist %SYSTEMROOT%\Microsoft.NET\Framework\v1.0.3705 goto net10
   
echo Error: .NET Framework 3.5, 3.0, 2.0, 1.1 or 1.0 required.
echo.
goto end

:net10
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v1.0.3705
goto compile

:net11
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v1.1.4322
goto compile

:net20
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v2.0.50727
goto compile

:net35
set VBC_PATH=%SYSTEMROOT%\Microsoft.NET\Framework\v3.5
goto compile

:compile
%VBC_PATH%\vbc %FileName%.vb /target:winexe

:RunEXE
start %FileName%.exe


Я этот трюк подсмотрел у Jean-Claude Manoli - ведущего .NET программиста, автора CSharpFormat
>>
с тех пор конечно и vbc.exe в проверку путей добавил, да и вообще, программу по переводу VB.NET исходников в батник создал
Код: Выделить всё
Imports System
Imports Microsoft.VisualBasic

Class DotNet2DotNetInBat
    Shared Sub Main(ByVal CmdArgs() As String)
        If CmdArgs.Length <> 1 Then
            Console.WriteLine(Command$() & " bad using")
            Return
        End If
        Dim b As Boolean
        Dim r As IO.StreamReader = New IO.StreamReader(CmdArgs(0), Text.Encoding.Default)
        Dim file As String = r.ReadToEnd
        r.Close()
        Dim w As IO.StreamWriter = New IO.StreamWriter(CmdArgs(0) & ".bat", False, Text.Encoding.Default)
        w.Write("echo Rem Start Code >%FileName%.vb" & vbCrLf & "echo ")
        For Each c As Char In file
            Select Case (c)
                Case vbCr
                    w.Write("' >>%FileName%.vb")
                Case vbLf
                    w.Write(vbCrLf & "echo ")
                Case """"
                    If b Then
                        b = False
                    Else
                        b = True
                    End If
                    w.Write(c)
                Case ">"
                    If b Then
                        w.Write(c)
                    Else
                        w.Write("^" & c)
                    End If
                Case "<"
                    If b Then
                        w.Write(c)
                    Else
                        w.Write("^" & c)
                    End If
                Case "&"
                    If b Then
                        w.Write(c)
                    Else
                        w.Write("^" & c)
                    End If
                Case Else
                    w.Write(c)
            End Select
        Next c
        w.Write("' >>%FileName%.vb")
        w.Close()
    End Sub
End Class


Но такой вариант не подойдёт для сборки WPF проектов в которых есть xaml файл.
В этом случае нужно с того же батника, например, нагенерить солющен и проект, а потом задействовать MSBuild.exe, а не напрямую vbc.exe

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 05.07.2013 (Пт) 23:04

Admiralisimys писал(а):Qwertiy хороший подход (х64 вариант задействован и номера версий не захардкоджены)

Однако я при этом полагаюсь на алфавитную сортировку имён...

Admiralisimys писал(а):программу по переводу VB.NET исходников в батник создал

Не понял, а зачем?

Admiralisimys писал(а):В этом случае нужно с того же батника, например, нагенерить солющен и проект, а потом задействовать MSBuild.exe, а не напрямую vbc.exe

Эм.. Как правило солюшн с проектом и так есть...
Я конечно могу что-то путать, но разве msbuild сам ставится вместе в фреймвёком? На всякий случай дополнительный вопрос, а в случае клиентского профиля?

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Компиляция VB.NET с помощью bat-файла

Сообщение Admiralisimys » 07.07.2013 (Вс) 11:14

Qwertiy что бы одним bat файлом передать и сам исходный код программы (выше есть пример, начиная со строки echo ' A "Hello World!" program in Visual Basic. >%FileName%.vb) так и инструкции по её сборке.
Я б солющены тоже в бат файл разместил дыбы полностью соблюсти подход всё в одном.

Да во фреймворках (кроме .NET1.x) MSBuild содержится
.NET 2.0 -> DOTNETFX.EXE\netfx.msi\_13017_URTM_STD_ENU_X86_IXP.MSM\FL_MSBuild_exe_67853_____X86.3643236F_FC70_11D3_A536_0090278A1BB8
.NET 3.0 -> DOTNETFX3.EXE\wcu\dotNetFramework\dotnetfx.exe\netfx.msi\_13017_URTM_STD_ENU_X86_IXP.MSM\FL_MSBuild_exe_67853_____X86.3643236F_FC70_11D3_A536_0090278A1BB8 (тот же что и в .NET2.0 только вложен в структуре папок установщика .NET 3.0)
.NET 3.5 -> dotnetfx35_KB951847.exe\wcu\.\.\.\.\.\dotNetFramework\dotNetFX35\x86\netfx35_x86.exe\vs_setup.cab\FL_MSBuild_exe_v35_x86_ln.3643236F_FC70_11D3_A536_0090278A1BB8
.NET 4.0 -> dotNetFx40_Full_x86_x64.exe\netfx_Extended.mzz\msbuild.exe_x86
.NET 4.5 -> dotNetFx45_Full_x86_x64.exe\netfx_Full.mzz\msbuild.exe_x86

А вот при установки клиентского профиля .NET 4.0 последний установлен увы не будет.
Но в свежи установленной Windows 8/8.1 он есть - %SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Компиляция VB.NET с помощью bat-файла

Сообщение Admiralisimys » 28.12.2015 (Пн) 15:58

Обновление для .NET 4.5.1/Windows 8.1/Visual Studio 2013 и выше.

Новые версии стали размещать в совершенно новой локации,
на текущий момент (.NET 4.6.1) на x64 системе это
Код: Выделить всё
%ProgramFiles(x86)%\MSBuild\12.0\Bin\vbc.exe
%ProgramFiles(x86)%\MSBuild\12.0\Bin\amd64\vbc.exe
%ProgramFiles(x86)%\MSBuild\14.0\Bin\vbc.exe
%ProgramFiles(x86)%\MSBuild\14.0\Bin\amd64\vbc.exe

Для х86 OC вместо %ProgramFiles(x86)% нужно проверять %ProgramFiles%, причём amd64 может и не быть, не в курсе позволена ли крос компиляция.
А vbc.exe из последней версии в папке Windows (%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\vbc.exe) теперь сообщит:
Код: Выделить всё
This compiler is provided as part of the Microsoft (R) .NET Framework, but only supports language versions up to Visual Basic 2012, which is no longer the latest version. For compilers that support newer versions of the Visual Basic programming language, see http://go.microsoft.com/fwlink/?LinkID=533241


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList