如果曾经使用Java开发过Web应用程序,你一定会对Java applets比较熟悉,这是一种基本上在浏览器中运行的小型程序。当浏览器加载包含有Java applets标志的HTML代码时,Java applets就会执行,网页中的Windows Forms控件的运行方式与Java applets相似。我们可以使用由Windows Forms技术提供的丰富的类开发Windows Forms控件,然后在网页中部署这些控件,当浏览器加载这些网页时,就会执行包含在Windows Forms控件中的代码。
.NET的伟大之处之一是它提供的与IE的无缝集成能力。例如,我们甚至能够在用户不知道的情况下从IE中激活一个Windows Forms控件。尽管利用了由.NET CLR提供的Code Access Security的所有功能,但这是在无需进行注册的情况下完成的。
当开发Windows Forms控件时,我们就通过继承的方式拥有了Windows Forms类所提供的所有功能。例如,我们可以使用Windows Forms控件验证技术对用户输入的数据进行广泛的验证,同样地,我们可以从窗体控件中调用远程Web服务。通过使用所有这些技术,我们就能够使用.NET平台开发丰富、功能强大的应用程序。
实现
在这一部分,我们将学习如何创建简单的Windows Forms控件并将它托管在IE中。下面是激活IE中Windows Forms控件的5个步骤:
·创建Windows Forms控件。
·创建包含标识Windows Forms控件的对象标志的HTML文档。
·配置正确激活控件所需要的虚拟目录。
·配置代码访问权限。
·运行该控件。
下面我们就来详细地学习上面的每一个步骤。
创建Windows Forms控件
在这一步骤中,我们将创建一个简单的Windows Forms控件,它向用户显示“Hello World”信息。如政略所示,我们将首先创建一个名为HelloWorldControl的新Visual C# Windows Control Library项目。
一旦创建项目后,我们将把缺省的用户控件更名为HelloWorldCtl。我们将在用户控件上添加一个名为lblMessage的标签控件和一个名为btnClick的按钮。当用户点击点击按钮时,程序就会执行下面的代码,向用户显示一个简单的信息:
既然已经创建了控件,下面我们来编译该项目,并创建可执行代码。
创建HTML网页
在这一步骤中,我们将创建一个HTML文档,并在其中插入用来激活Windows Forms控件的对象标志。HTML网页如下:
在对象标志的classid属性中,我们将路径指定为控件库组合体和控件的全名,控件的全名包括名字空间和控件类名字。从上面的代码中可以看到,组合体和控件全名之间用#号隔开,这二个参数构成了识别该控件的唯一控件标识符。由于是唯一地由名字HelloWorldControl1标识的,我们还可以针对该控件编写客户端脚本代码。
配置虚拟目录
创建HTML代码后,我们就可以创建一个名为HelloWorldControlHost的新虚拟目录,并在其中添加控件(HelloWorldControl.dll)和HTML文档(HelloWorld.htm)。除了配置虚拟目录外,将虚拟目录的执行权限设置为Scripts也是非常重要的。如果将其执行权限设置为Scripts & Executables,控件就不会被正确地激活。通过打开虚拟目录的Properties窗口(下图),我们可以验证虚拟目录的权限。
配置代码访问权限
如果控件在企业内部网上,它公正确地执行,但如果要运行来自互联网网站上的控件,就需要对IE进行配置或修改安全策略,使它能够运行。通过将托管网页看成是受信任区段的一部分,就能够做到这一点。为了将你的站点设置为受信任区段的一部分,我们可以在IE中通过选择“工具”->“选项”->“安全”->“受信任的站点”,然后将你的站点添加到列表中,再点击“OK”按钮。这样下次再浏览到该网页时,控件就会得到正确的执行,因为已经设置了互联网许可。
运行控件
要运行控件,只要在浏览器中浏览托管该控件的HTML网页即可。在显示的HTML网页中,如果点击“Click Here”命令按钮,控件就会如下图所示显示“Hello World”的消息。
在这个例子中,我们主要演习了如何创建简单的Windows Forms控件,并在IE中托管它。在下一部分,我们将学习如何使用Windows Forms控件从客户机中直接访问Web服务。
从Windows Forms控件中访问Web服务
Windows Forms控件的主要优点是它能够使我们在客户机上实现丰富的用户体验。例如,我们能够直接从客户机上访问Web服务,然后甚至在无需刷新网页的情况下向用户显示结果。为了演示这一点,我们将首先创建一个Web服务,然后从Windows Forms控件中调用该Web服务。
创建Web服务
首先,如图所示,我们将创建一个名为AuthorsWebService的Visual C# ASP.NET Web服务。
Web服务创建后,我们就能够将Web服务类的名字修改为AuthorsService,然后在AuthorsService类中添加一个名为GetAuthors的新方法。GetAuthors方法如下所示:
GetAuthors方法的代码非常简单,我们首先从web.config文件中获得连接字符串,它被存储在web.config文件的appSettings小节中。
然后我们使用连接字符串作为一个参数创建SqlConnection对象的一个实例,再以执行的查询和SqlConnection对象为参数创建一个SqlDataAdapter对象的实例,然后,我们调用SqlDataAdapter对象的Fill方法执行查询,并用查询的填写DataSet。最后我们释放所有资源,并将DataSet返回给Web服务的调用者。在创建Web服务后,我们就可以着手开始创建Web服务的客户端应用程序了。
为Web服务客户端的Windows Forms控件的创建
由于希望从Windows Forms控件中调用Web服务,我们将创建一个名为AuthorsWebServiceClientControl的新Visual C# Control Library项目。
创建项目后,我们可以将缺省的用户控件改名为AuthorsControl。我们可以在用户的控件中添加名为gridAuthors的DataGrid和名为btnClick的命令按钮。在命令按钮的Click事件中,我们将编写调用Web服务的代码。在此之前,我们可以在Visual Studio .NET中使用“Add Web Reference”选项添加该Web服务的地址。在“Add Web Reference”对话框中,我们可以输入Web服务的位置并按回车键,然后点击“Add Reference”按钮添加Web服务的地址。这样,我们就为Authors Web服务创建了一个代理。
创建代理后,我们就可以开始添加调用Web服务的代码了,这部分代码添加在此前添加的命令按钮中的click事件中。
在上面的几行代码中,我们创建了Web服务代理类的一个实例,然后调用了GetAuthors方法,将从Web服务返回的DataSet赋予DataGrid控件的DataSource属性。现在,就可以对项目进行编译,创建组合体了。
从Windows Forms控件中访问Web服务
Windows Forms控件的主要优点是它能够使我们在客户机上实现丰富的用户体验。例如,我们能够直接从客户机上访问Web服务,然后甚至在无需刷新网页的情况下向用户显示结果。为了演示这一点,我们将首先创建一个Web服务,然后从Windows Forms控件中调用该Web服务。
创建Web服务
首先,如图所示,我们将创建一个名为AuthorsWebService的Visual C# ASP.NET Web服务。
Web服务创建后,我们就能够将Web服务类的名字修改为AuthorsService,然后在AuthorsService类中添加一个名为GetAuthors的新方法。GetAuthors方法如下所示:
GetAuthors方法的代码非常简单,我们首先从web.config文件中获得连接字符串,它被存储在web.config文件的appSettings小节中。
然后我们使用连接字符串作为一个参数创建SqlConnection对象的一个实例,再以执行的查询和SqlConnection对象为参数创建一个SqlDataAdapter对象的实例,然后,我们调用SqlDataAdapter对象的Fill方法执行查询,并用查询的填写DataSet。最后我们释放所有资源,并将DataSet返回给Web服务的调用者。在创建Web服务后,我们就可以着手开始创建Web服务的客户端应用程序了。
为Web服务客户端的Windows Forms控件的创建
由于希望从Windows Forms控件中调用Web服务,我们将创建一个名为AuthorsWebServiceClientControl的新Visual C# Control Library项目。
创建项目后,我们可以将缺省的用户控件改名为AuthorsControl。我们可以在用户的控件中添加名为gridAuthors的DataGrid和名为btnClick的命令按钮。在命令按钮的Click事件中,我们将编写调用Web服务的代码。在此之前,我们可以在Visual Studio .NET中使用“Add Web Reference”选项添加该Web服务的地址。在“Add Web Reference”对话框中,我们可以输入Web服务的位置并按回车键,然后点击“Add Reference”按钮添加Web服务的地址。这样,我们就为Authors Web服务创建了一个代理。
创建代理后,我们就可以开始添加调用Web服务的代码了,这部分代码添加在此前添加的命令按钮中的click事件中。
在上面的几行代码中,我们创建了Web服务代理类的一个实例,然后调用了GetAuthors方法,将从Web服务返回的DataSet赋予DataGrid控件的DataSource属性。现在,就可以对项目进行编译,创建组合体了。
从Windows Forms控件中访问Web服务
Windows Forms控件的主要优点是它能够使我们在客户机上实现丰富的用户体验。例如,我们能够直接从客户机上访问Web服务,然后甚至在无需刷新网页的情况下向用户显示结果。为了演示这一点,我们将首先创建一个Web服务,然后从Windows Forms控件中调用该Web服务。
创建Web服务
首先,如图所示,我们将创建一个名为AuthorsWebService的Visual C# ASP.NET Web服务。
Web服务创建后,我们就能够将Web服务类的名字修改为AuthorsService,然后在AuthorsService类中添加一个名为GetAuthors的新方法。GetAuthors方法如下所示:
GetAuthors方法的代码非常简单,我们首先从web.config文件中获得连接字符串,它被存储在web.config文件的appSettings小节中。
然后我们使用连接字符串作为一个参数创建SqlConnection对象的一个实例,再以执行的查询和SqlConnection对象为参数创建一个SqlDataAdapter对象的实例,然后,我们调用SqlDataAdapter对象的Fill方法执行查询,并用查询的填写DataSet。最后我们释放所有资源,并将DataSet返回给Web服务的调用者。在创建Web服务后,我们就可以着手开始创建Web服务的客户端应用程序了。
为Web服务客户端的Windows Forms控件的创建
由于希望从Windows Forms控件中调用Web服务,我们将创建一个名为AuthorsWebServiceClientControl的新Visual C# Control Library项目。
创建项目后,我们可以将缺省的用户控件改名为AuthorsControl。我们可以在用户的控件中添加名为gridAuthors的DataGrid和名为btnClick的命令按钮。在命令按钮的Click事件中,我们将编写调用Web服务的代码。在此之前,我们可以在Visual Studio .NET中使用“Add Web Reference”选项添加该Web服务的地址。在“Add Web Reference”对话框中,我们可以输入Web服务的位置并按回车键,然后点击“Add Reference”按钮添加Web服务的地址。这样,我们就为Authors Web服务创建了一个代理。
创建代理后,我们就可以开始添加调用Web服务的代码了,这部分代码添加在此前添加的命令按钮中的click事件中。
在上面的几行代码中,我们创建了Web服务代理类的一个实例,然后调用了GetAuthors方法,将从Web服务返回的DataSet赋予DataGrid控件的DataSource属性。现在,就可以对项目进行编译,创建组合体了。
.NET的伟大之处之一是它提供的与IE的无缝集成能力。例如,我们甚至能够在用户不知道的情况下从IE中激活一个Windows Forms控件。尽管利用了由.NET CLR提供的Code Access Security的所有功能,但这是在无需进行注册的情况下完成的。
当开发Windows Forms控件时,我们就通过继承的方式拥有了Windows Forms类所提供的所有功能。例如,我们可以使用Windows Forms控件验证技术对用户输入的数据进行广泛的验证,同样地,我们可以从窗体控件中调用远程Web服务。通过使用所有这些技术,我们就能够使用.NET平台开发丰富、功能强大的应用程序。
实现
在这一部分,我们将学习如何创建简单的Windows Forms控件并将它托管在IE中。下面是激活IE中Windows Forms控件的5个步骤:
·创建Windows Forms控件。
·创建包含标识Windows Forms控件的对象标志的HTML文档。
·配置正确激活控件所需要的虚拟目录。
·配置代码访问权限。
·运行该控件。
下面我们就来详细地学习上面的每一个步骤。
创建Windows Forms控件
在这一步骤中,我们将创建一个简单的Windows Forms控件,它向用户显示“Hello World”信息。如政略所示,我们将首先创建一个名为HelloWorldControl的新Visual C# Windows Control Library项目。
一旦创建项目后,我们将把缺省的用户控件更名为HelloWorldCtl。我们将在用户控件上添加一个名为lblMessage的标签控件和一个名为btnClick的按钮。当用户点击点击按钮时,程序就会执行下面的代码,向用户显示一个简单的信息:
private void btnClick_Click(object sender, System.EventArgs e) { lblDisplayMessage.Text = "Hello World"; } |
既然已经创建了控件,下面我们来编译该项目,并创建可执行代码。
创建HTML网页
在这一步骤中,我们将创建一个HTML文档,并在其中插入用来激活Windows Forms控件的对象标志。HTML网页如下:
<html> <body> <p>Hello World Control<br> <br></body> <object id="HelloWorldControl1" classid="http:HelloWorldControl.dll#HelloWorldControl.HelloWorldCtl" height="500" width="500" VIEWASTEXT> </object> <br><br> </html> |
在对象标志的classid属性中,我们将路径指定为控件库组合体和控件的全名,控件的全名包括名字空间和控件类名字。从上面的代码中可以看到,组合体和控件全名之间用#号隔开,这二个参数构成了识别该控件的唯一控件标识符。由于是唯一地由名字HelloWorldControl1标识的,我们还可以针对该控件编写客户端脚本代码。
配置虚拟目录
创建HTML代码后,我们就可以创建一个名为HelloWorldControlHost的新虚拟目录,并在其中添加控件(HelloWorldControl.dll)和HTML文档(HelloWorld.htm)。除了配置虚拟目录外,将虚拟目录的执行权限设置为Scripts也是非常重要的。如果将其执行权限设置为Scripts & Executables,控件就不会被正确地激活。通过打开虚拟目录的Properties窗口(下图),我们可以验证虚拟目录的权限。
配置代码访问权限
如果控件在企业内部网上,它公正确地执行,但如果要运行来自互联网网站上的控件,就需要对IE进行配置或修改安全策略,使它能够运行。通过将托管网页看成是受信任区段的一部分,就能够做到这一点。为了将你的站点设置为受信任区段的一部分,我们可以在IE中通过选择“工具”->“选项”->“安全”->“受信任的站点”,然后将你的站点添加到列表中,再点击“OK”按钮。这样下次再浏览到该网页时,控件就会得到正确的执行,因为已经设置了互联网许可。
运行控件
要运行控件,只要在浏览器中浏览托管该控件的HTML网页即可。在显示的HTML网页中,如果点击“Click Here”命令按钮,控件就会如下图所示显示“Hello World”的消息。
在这个例子中,我们主要演习了如何创建简单的Windows Forms控件,并在IE中托管它。在下一部分,我们将学习如何使用Windows Forms控件从客户机中直接访问Web服务。
从Windows Forms控件中访问Web服务
Windows Forms控件的主要优点是它能够使我们在客户机上实现丰富的用户体验。例如,我们能够直接从客户机上访问Web服务,然后甚至在无需刷新网页的情况下向用户显示结果。为了演示这一点,我们将首先创建一个Web服务,然后从Windows Forms控件中调用该Web服务。
创建Web服务
首先,如图所示,我们将创建一个名为AuthorsWebService的Visual C# ASP.NET Web服务。
Web服务创建后,我们就能够将Web服务类的名字修改为AuthorsService,然后在AuthorsService类中添加一个名为GetAuthors的新方法。GetAuthors方法如下所示:
[WebMethod] public DataSet GetAuthors() { //从配置文件中获得连接串 string connString = System.Configuration.ConfigurationSettings.AppSettings["connectionString"]; SqlConnection sqlConn = new SqlConnection(connString); DataSet dstAuthors = new DataSet("Authors"); SqlDataAdapter adapter = new SqlDataAdapter("Select * from Authors",sqlConn); //用查询结果填写Dataset adapter.Fill(dstAuthors,"Author"); //关闭和处理被打开的数据库连接 sqlConn.Close(); sqlConn.Dispose(); //向调用者返回Authors Dataset return dstAuthors; } |
GetAuthors方法的代码非常简单,我们首先从web.config文件中获得连接字符串,它被存储在web.config文件的appSettings小节中。
<appSettings> <add key="connectionString" value="server=localhost;uid=sa;pwd=thiru;database=Pubs"> </add> </appSettings> |
然后我们使用连接字符串作为一个参数创建SqlConnection对象的一个实例,再以执行的查询和SqlConnection对象为参数创建一个SqlDataAdapter对象的实例,然后,我们调用SqlDataAdapter对象的Fill方法执行查询,并用查询的填写DataSet。最后我们释放所有资源,并将DataSet返回给Web服务的调用者。在创建Web服务后,我们就可以着手开始创建Web服务的客户端应用程序了。
为Web服务客户端的Windows Forms控件的创建
由于希望从Windows Forms控件中调用Web服务,我们将创建一个名为AuthorsWebServiceClientControl的新Visual C# Control Library项目。
创建项目后,我们可以将缺省的用户控件改名为AuthorsControl。我们可以在用户的控件中添加名为gridAuthors的DataGrid和名为btnClick的命令按钮。在命令按钮的Click事件中,我们将编写调用Web服务的代码。在此之前,我们可以在Visual Studio .NET中使用“Add Web Reference”选项添加该Web服务的地址。在“Add Web Reference”对话框中,我们可以输入Web服务的位置并按回车键,然后点击“Add Reference”按钮添加Web服务的地址。这样,我们就为Authors Web服务创建了一个代理。
创建代理后,我们就可以开始添加调用Web服务的代码了,这部分代码添加在此前添加的命令按钮中的click事件中。
private void btnClick_Click(object sender, System.EventArgs e) { this.Cursor = Cursors.WaitCursor; AuthorsWebServiceProxy.AuthorsService authorsSvc = new AuthorsWebServiceProxy.AuthorsService(); gridAuthors.DataSource = authorsSvc.GetAuthors(); this.Cursor = Cursors.Default; } |
在上面的几行代码中,我们创建了Web服务代理类的一个实例,然后调用了GetAuthors方法,将从Web服务返回的DataSet赋予DataGrid控件的DataSource属性。现在,就可以对项目进行编译,创建组合体了。
从Windows Forms控件中访问Web服务
Windows Forms控件的主要优点是它能够使我们在客户机上实现丰富的用户体验。例如,我们能够直接从客户机上访问Web服务,然后甚至在无需刷新网页的情况下向用户显示结果。为了演示这一点,我们将首先创建一个Web服务,然后从Windows Forms控件中调用该Web服务。
创建Web服务
首先,如图所示,我们将创建一个名为AuthorsWebService的Visual C# ASP.NET Web服务。
Web服务创建后,我们就能够将Web服务类的名字修改为AuthorsService,然后在AuthorsService类中添加一个名为GetAuthors的新方法。GetAuthors方法如下所示:
[WebMethod] public DataSet GetAuthors() { //从配置文件中获得连接串 string connString = System.Configuration.ConfigurationSettings.AppSettings["connectionString"]; SqlConnection sqlConn = new SqlConnection(connString); DataSet dstAuthors = new DataSet("Authors"); SqlDataAdapter adapter = new SqlDataAdapter("Select * from Authors",sqlConn); //用查询结果填写Dataset adapter.Fill(dstAuthors,"Author"); //关闭和处理被打开的数据库连接 sqlConn.Close(); sqlConn.Dispose(); //向调用者返回Authors Dataset return dstAuthors; } |
GetAuthors方法的代码非常简单,我们首先从web.config文件中获得连接字符串,它被存储在web.config文件的appSettings小节中。
<appSettings> <add key="connectionString" value="server=localhost;uid=sa;pwd=thiru;database=Pubs"> </add> </appSettings> |
然后我们使用连接字符串作为一个参数创建SqlConnection对象的一个实例,再以执行的查询和SqlConnection对象为参数创建一个SqlDataAdapter对象的实例,然后,我们调用SqlDataAdapter对象的Fill方法执行查询,并用查询的填写DataSet。最后我们释放所有资源,并将DataSet返回给Web服务的调用者。在创建Web服务后,我们就可以着手开始创建Web服务的客户端应用程序了。
为Web服务客户端的Windows Forms控件的创建
由于希望从Windows Forms控件中调用Web服务,我们将创建一个名为AuthorsWebServiceClientControl的新Visual C# Control Library项目。
创建项目后,我们可以将缺省的用户控件改名为AuthorsControl。我们可以在用户的控件中添加名为gridAuthors的DataGrid和名为btnClick的命令按钮。在命令按钮的Click事件中,我们将编写调用Web服务的代码。在此之前,我们可以在Visual Studio .NET中使用“Add Web Reference”选项添加该Web服务的地址。在“Add Web Reference”对话框中,我们可以输入Web服务的位置并按回车键,然后点击“Add Reference”按钮添加Web服务的地址。这样,我们就为Authors Web服务创建了一个代理。
创建代理后,我们就可以开始添加调用Web服务的代码了,这部分代码添加在此前添加的命令按钮中的click事件中。
private void btnClick_Click(object sender, System.EventArgs e) { this.Cursor = Cursors.WaitCursor; AuthorsWebServiceProxy.AuthorsService authorsSvc = new AuthorsWebServiceProxy.AuthorsService(); gridAuthors.DataSource = authorsSvc.GetAuthors(); this.Cursor = Cursors.Default; } |
在上面的几行代码中,我们创建了Web服务代理类的一个实例,然后调用了GetAuthors方法,将从Web服务返回的DataSet赋予DataGrid控件的DataSource属性。现在,就可以对项目进行编译,创建组合体了。
从Windows Forms控件中访问Web服务
Windows Forms控件的主要优点是它能够使我们在客户机上实现丰富的用户体验。例如,我们能够直接从客户机上访问Web服务,然后甚至在无需刷新网页的情况下向用户显示结果。为了演示这一点,我们将首先创建一个Web服务,然后从Windows Forms控件中调用该Web服务。
创建Web服务
首先,如图所示,我们将创建一个名为AuthorsWebService的Visual C# ASP.NET Web服务。
Web服务创建后,我们就能够将Web服务类的名字修改为AuthorsService,然后在AuthorsService类中添加一个名为GetAuthors的新方法。GetAuthors方法如下所示:
[WebMethod] public DataSet GetAuthors() { //从配置文件中获得连接串 string connString = System.Configuration.ConfigurationSettings.AppSettings["connectionString"]; SqlConnection sqlConn = new SqlConnection(connString); DataSet dstAuthors = new DataSet("Authors"); SqlDataAdapter adapter = new SqlDataAdapter("Select * from Authors",sqlConn); //用查询结果填写Dataset adapter.Fill(dstAuthors,"Author"); //关闭和处理被打开的数据库连接 sqlConn.Close(); sqlConn.Dispose(); //向调用者返回Authors Dataset return dstAuthors; } |
GetAuthors方法的代码非常简单,我们首先从web.config文件中获得连接字符串,它被存储在web.config文件的appSettings小节中。
<appSettings> <add key="connectionString" value="server=localhost;uid=sa;pwd=thiru;database=Pubs"> </add> </appSettings> |
然后我们使用连接字符串作为一个参数创建SqlConnection对象的一个实例,再以执行的查询和SqlConnection对象为参数创建一个SqlDataAdapter对象的实例,然后,我们调用SqlDataAdapter对象的Fill方法执行查询,并用查询的填写DataSet。最后我们释放所有资源,并将DataSet返回给Web服务的调用者。在创建Web服务后,我们就可以着手开始创建Web服务的客户端应用程序了。
为Web服务客户端的Windows Forms控件的创建
由于希望从Windows Forms控件中调用Web服务,我们将创建一个名为AuthorsWebServiceClientControl的新Visual C# Control Library项目。
创建项目后,我们可以将缺省的用户控件改名为AuthorsControl。我们可以在用户的控件中添加名为gridAuthors的DataGrid和名为btnClick的命令按钮。在命令按钮的Click事件中,我们将编写调用Web服务的代码。在此之前,我们可以在Visual Studio .NET中使用“Add Web Reference”选项添加该Web服务的地址。在“Add Web Reference”对话框中,我们可以输入Web服务的位置并按回车键,然后点击“Add Reference”按钮添加Web服务的地址。这样,我们就为Authors Web服务创建了一个代理。
创建代理后,我们就可以开始添加调用Web服务的代码了,这部分代码添加在此前添加的命令按钮中的click事件中。
private void btnClick_Click(object sender, System.EventArgs e) { this.Cursor = Cursors.WaitCursor; AuthorsWebServiceProxy.AuthorsService authorsSvc = new AuthorsWebServiceProxy.AuthorsService(); gridAuthors.DataSource = authorsSvc.GetAuthors(); this.Cursor = Cursors.Default; } |
在上面的几行代码中,我们创建了Web服务代理类的一个实例,然后调用了GetAuthors方法,将从Web服务返回的DataSet赋予DataGrid控件的DataSource属性。现在,就可以对项目进行编译,创建组合体了。