使用VBC.exe编译在VS2017中创建的Windows窗体应用程序?

时间:2017-08-26 09:59:00

标签: vb.net

我需要能够从Visual Studio进行编程,也可以从没有管理员权限的计算机上的usb密钥进行编程。

为了达到这个目标,我使用了以下教程 VB.Net Programming Using Notepad And Command Prompt (Part I) Tutorial(VB.Net) Creating Windows Form App Using Notepad+CommandPrompt

现在这个功能很好,不仅有一个问题,使用visual studio很难编辑。由于缺少App.config等文件以及" My Project"中的任何内容,Intellisense的工作效果不佳。子目录。

所以我决定尝试从VS2017项目开始,并仅使用vbc.exe和resgen.exe进行编译

到目前为止,这是我的尝试。

首先我创建了一个新项目。 我选择了一个Windows窗体项目,虽然我想要制作的应用程序可能会在" Sub Main"并运行一个" ApplicationContext"类而不是表单。我试过Console Application,但是我发现控制台窗口很烦人。我可以轻松地隐藏控制台窗口但它在启动时仍然会闪烁。 WPF看起来太新了,现在很难使用。 Windows服务可能需要管理员权限才能运行,我不确定空项目到底是什么。

所以我创建了一个Windows窗体项目 project creation

接下来我做了前两个更改 我禁用了应用程序框架。 它对My命名空间有所帮助。由于某些原因,它使得手动编译变得更加困难。我还将目标.net框架更改为版本4。 这个版本是因为我主要找到版本" v4.0.30319"安装.net框架,以便更高版本可能无法正常工作。 https://i.imgur.com/hzFOlwo.png

现在,我保存所有这些并尝试构建。出现一个空的窗体窗口,这至少在visual studio中起作用。

为了编译我有一个基本的.bat脚本。 我将免费提供的resgen.exe文件复制到"我的项目"文件夹中。

compile.bat的代码

path=%path%;c:\windows\microsoft.net\framework\v4.0.30319
cd "My Project"
resgen /compile Resources.resx,..\bin\debug\Resources.resources
cd ..
VBC /OUT:bin\Debug\app.exe /resource:"bin\debug\*.resources" /imports:System.Data,System.Deployment,System.Drawing,System.Windows.Forms,System.Xml,System.Xml.Linq,System.Data.DataSetExtensions,System.Collections,System.Collections.Generic,System.Data,System.Drawing,System.Diagnostics,System.Windows.Forms,System.Linq,System.Xml.Linq,System.Threading.Tasks /T:exe *.vb "My Project\*.vb" 
pause

一些解释,

首先运行此脚本,重新编译资源文件,然后编译可执行文件。

它将包含所有* .vb文件以及资源文件。

到目前为止,以下文件将被忽略

App.config
WindowsApp2.vbproj
My Project\Application.myapp
My Project\Settings.settings

现在很长的导入列表来自vbproj文件。

当您在visual studio中添加更多引用时,它当前不会自动更新。这个bat文件的未来版本将使用vbscript制作,并且应该提取并自动添加导入/引用,但还没有。

现在运行时会发生什么?

它不能用于3个错误,如下所示:

首先它不尊重定义的启动对象 startup object

此对象在.vbproj文件中定义如下

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <StartupObject>WindowsApp2.Form1</StartupObject>
  </PropertyGroup>
</Project>

vbc.exe尚未考虑此部分,因此它似乎默认使用Sub Main并出现第一个错误。

vbc : error BC30420: 'Sub Main' was not found in 'app'.

第二和第三个错误如下

C:\defaultpath\Visual Studio 2017\Projects\WindowsApp2\WindowsApp2\My
Project\Settings.Designer.vb(67) : error BC30002: Type 'WindowsApp2.My.MySetting
s' is not defined.

        Friend ReadOnly Property Settings() As Global.WindowsApp2.My.MySettings
                                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C:\defaultpath\Visual Studio 2017\Projects\WindowsApp2\WindowsApp2\My
Project\Settings.Designer.vb(69) : error BC30456: 'WindowsApp2' is not a member
of '<Default>'.

                Return Global.WindowsApp2.My.MySettings.Default

这两个错误都与Root Namespace配置有某种关系 root namespace setting

这是在.vbproj文件中声明的,但当前没有被compile.bat文件考虑

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <RootNamespace>WindowsApp2</RootNamespace>
  </PropertyGroup>
</Project>

在文件Visual Basic Compiler Options Listed Alphabetically中 选项/rootnamespace定义为&#34;指定所有类型声明的命名空间。&#34;

所以我将/ rootnamespace:WindowsApp2添加到我的compile.bat文件中,并解决了上面列出的上述两个问题。

最后,修复Sub Main问题,改为使用&#34; WindowsApp2.Form1&#34;在.vbproj文件中定义

/main命令似乎适合这个,所以我将/main:WindowsApp2.Form1添加到命令行。

在最后一分钟后,.resource文件处理的更改是最新的compile.bat

path=%path%;c:\windows\microsoft.net\framework\v4.0.30319
cd "My Project"
resgen Resources.resx
cd ..
VBC /OUT:bin\Debug\app.exe /main:WindowsApp2.Form1 /rootnamespace:WindowsApp2 /resource:"My Project\*.resources" /imports:System.Data,System.Deployment,System.Drawing,System.Windows.Forms,System.Xml,System.Xml.Linq,System.Data.DataSetExtensions,System.Collections,System.Collections.Generic,System.Data,System.Drawing,System.Diagnostics,System.Windows.Forms,System.Linq,System.Xml.Linq,System.Threading.Tasks /T:exe *.vb "My Project\*.vb" 
pause

这会编译一个没有错误的可执行文件。

我运行它并且Form1出现,不幸的是控制台窗口也出现了!

Form1 with console

所以看起来我仍然有一个控制台应用程序而不是Windows窗体应用程序 这可以通过修改从exe到winexe

定义为/target的/ T参数来解决

最终compile.bat

path=%path%;c:\windows\microsoft.net\framework\v4.0.30319
cd "My Project"
resgen Resources.resx
cd ..
VBC /OUT:bin\Debug\app.exe /main:WindowsApp2.Form1 /rootnamespace:WindowsApp2 /resource:"My Project\Resources.resources" /imports:System.Data,System.Deployment,System.Drawing,System.Windows.Forms,System.Xml,System.Xml.Linq,System.Data.DataSetExtensions,System.Collections,System.Collections.Generic,System.Data,System.Drawing,System.Diagnostics,System.Windows.Forms,System.Linq,System.Xml.Linq,System.Threading.Tasks /T:winexe *.vb "My Project\*.vb" 
pause

如果有人有任何意见或建议,我很乐意听到。 我开始写这个问题,但我在写这个问题的过程中解决了我的问题。 如果有更简单的方法,请告诉我。 与此同时,我希望这对于与我在同一条道路上的其他人有用。

再见!

0 个答案:

没有答案