介绍 由当前关于互联网的许多讨论来看 似乎微软的Visual Studio开发系统已经完全不再支持开发传统的基于Windows *** 作系统的应用程序了 而实际情况是 微软依然非常重视对基于Windows的应用程序的开发 Win Forms是一种全新的窗体形式 开发人员可以利用它创建充分利用微软的Windows *** 作系统中丰富的用户接口的应用程序 Win Forms是微软的 NET平台的一部分 采用了许多新的技术 包括一个公共应用程序框架 可管理的执行环境 集成的安全性和面向对象的设计原则 此外 Win Forms还提供了对方便迅速连接到互联网服务和创建基于ADO+数据模型的应用程序的支持 有了Visual Studio中全新的共享开发环境 开发人员就能够使用包括Visual Basic和C#在内的任何支持 NET平台的编程语言开发基于Win Forms的应用程序 Win Forms是什么? 就象在上面提到的那样 Win Forms是 NET Framework中专指Windows客户端UI编程的名字空间 它与被称作Web Forms的ASP+ UI的设计原理相同 但其中的类和具体的实现是完全不同的 Win API和Web组件之间的类是不能够互相转换的 然而 象 NET框架中的其他部分一样 一致性是其最优先考虑的部分 目的是让一个Win Forms开发人员能够迅速地适应Web Forms的编程方式 反之亦然 例如 二个名字空间都有Button类 其中都有文本域 OnClick事件和ForeColor BackColor Font等属性 Win Forms控制是完全基于System WinForms Control类的 Control类有基本的HWND功能 处理大部分常见的WM_xxxx消息 从Control类派生出的是RichControl控制 它添加了输出逻辑和绘制代码 System WinForms名字空间中的大部分控制都是由继承RichControl得来的 ScrollableControl添加了对窗口用户区滚动的支持 一般情况下 滚动支持是通过ContainerControl控制获得的 ContainerControl控制是由继承 ScrollableControl控制而得来的 其中添加了对子控制 焦点和标签进行管理的支持 由继承ContainerControl而生成的是Form 它是Win Form的最高层的控制 它有控制标题条 系统菜单 不规则窗口和缺省控制的属性 另一个由继承ContainterControl而生成的是UserControl 它就是开发人员可以创建的控制的基本类 UserControl是用来管理其他子控制的 微软的Visual Studio NET中有可视化的UserControl和Form设计器 我们可以发现用来添加和设计由继承它们生成的类的工程条目 我们已经讨论了有关Win Forms的最基本的知识 下面我们就来讨论Win Forms的一些深层次的特性 较短的学习周期 Win Forms的首要目的是能够尽可能地提高开发人员在开发Win 平台应用程序的编程效率 无论是GDI还是窗口状态管理 在Win 中编程者相当困难的 例如 象WS_BORDER或WS_CAPTION等窗口风格只能在创建窗口时设定或修改 当然了 象WS_VISIBLE或WS_CHILD等窗口风格可以在已经创建的窗口上进行修改 Win Forms就能够消除这种不统一性 确保 *** 作可以在所有时间以同一种方式进行 可以在任何时候以任何顺序修改Win Forms控制的属性 并产生希望的效果 在改变这些属性时需要创建新的HWND Win Forms会自动地创建窗口 并对它进行合理的设置 使用Win Forms 获得控制的通知或事件也更加简单 所有的Win Forms事件都是基于一种被称作Delegates的通用语言运行库功能的 Delegates是一种安全函数的指针 可以为任何控制的任何事件添加Delegate事件自理程序 我们也无需通过重载创建一个处理所有事件的类 创建一个事件图 或者为一个类中的所有事件实现一个接口而只会执行其中的一个 事件也可以通过重载继承类进行处理 但一般情况下只有控制的创建者和在高级的应用程序设计中才会这样作 接收一个按钮的Click事件是相当简单的 public class ButtonClickForm: System WinForms Form { private System WinForms Button button ; public ButtonClickForm() { // 创建按钮 button = new System WinForms Button() // 添加事件处理程序 button AddOnClick(new System EventHandler(button _Click)) // 在窗体上添加按钮 this Controls Add(button ) } private void button _Click(object sender EventArgs e) { MessageBox Show( button clicked! ) } } 在上面的代码中 我们已经创建了一个按钮并添加了一个事件处理程序方法button _Click 当该按钮被点击时 其中的几行代码就会开始执行
着手开发Win Forms工程也是相当简单的 在Visual Studio NET中创建Win Forms工程只会生成一个被编译的文件Form cs 而不会生成头文件 接口定义文件 引导应用程序文件 资源文件和库文件 工程所需要的所有信息都包含在窗体的代码中 其结果是工程可以很方便地由一个单一窗体组成的应用被扩充为包括有多个代码文件 复杂的由多窗体构成的应用程序 其中没有需要连接的临时对象文件 只有代码文件和已经建立的DLL文件 随着慢慢熟悉这种方法 创建 NET框架应用程序和C/C++应用程序在复杂性方面的判别就会越来越明显 由于信息只包含在代码文件中 在Visual Studio NET环境之外创建工程也是相当简单的 而无论是Visual Basic代码 C#代码或是其他任何支持 NET框架的语言写成的 由于Win Forms是建立在通用语言运行库的 因此开发人员可以选择任何一种支持通用语言运行库的编程语言开发Win 应用程序 开发人员可以使用从C#到COBOL Eiffel Perl在内的 种编程语言开发Win Forms应用程序(或者Web Forms应用程序和Data应用程序) 这使得掌握多种编程语言的开发人员可以高效地使用Win Forms建立应用程序 输出布局 如果你曾经尝试着创建一个能够正确地改变大小的窗体 就会发现这是多么困难了/MFC和以前的Visual Basic没有对此提供任何内置的支持 但在Visual Studio NET中仅仅需要几行的代码(甚至这些代码不需要你动手编写 因为在设计窗体时的Property Browser(属性浏览器)中就能实现这样的功能 ) 就能创建一个能够正确地改变大小的对话框 基本的输出布局是由二部分组成的 Anchoring和Docking RichControl类有一个Anchor属性 这是一个枚举型变量的值通过或运算来描述一个控制与其父控制边缘的距离 例如 如果在一个窗体上创建了一个按钮 并且将其Anchor属性设置为AnchorStyles BottomRight 则在改变大小时 按钮将与窗体的下 右边缘保持相同的距离 如果将Anchor属性设置为AnchorStyles All 按钮将与窗体的四周保持固定的距离 按钮就会改变自己的大小来符合这一要求 Docking是Anchoring的一种特殊情况 RichControl的Dock属性定义控制与父控制的哪个边相接触 它的值可以是Top Left Right Bottom或Fill 当父控制的大小变化时 它将仍然维持与特定边缘的距离 将一个控制移动到移动到父控制的底部 并将Anchor设置为AnchorStyle BottomLeftRight 等同于将Dock属性设置为Bottom 在本例中 列表框与窗体的左边缘相接触 按钮与窗体的顶 左和右边保持一定的距离 因此 它们能够维持相对的位置和大小 下面例子中对话框(图 )是使用Visual Studio NET中的Win Forms Designer设计的 在创建它时我用了 分钟的时间 而没有编写一行代码 // ResizableSample cs namespace ResizableSampleNamespace { using System; using System Drawing; using System ComponentModel; using System WinForms; /// /// Summary description for ResizableSample /// public class ResizableSample : System WinForms Form { /// /// Required by the Win Forms designer /// private System ComponentModel Container ponents; private System WinForms Button button ; private System WinForms Button button ; private System WinForms Button button ; private System WinForms ListBox listBox ; public ResizableSample() { // Win Form Designer要求下面的初始化函数 InitializeComponent() } /// /// 清除所使用的资源文件 /// public override void Dispose() { base Dispose() ponents Dispose() } /// /// 应用程序的主入口 /// public static void Main(string[] args) { Application Run(new ResizableSample()) } /// /// Designer所需要的方法不要使用编辑器编辑其中的内容 /// private void InitializeComponent() { ponents = new System ComponentModel Container() this button = new System WinForms Button() this button = new System WinForms Button() this button = new System WinForms Button() this listBox = new System WinForms ListBox() //@design this TrayLargeIcon = false; //@design this TrayHeight = ; this Text = Resizable Dialog ; this IMEMode = System WinForms IMEMode Off; this AutoScaleBaseSize = new System Drawing Size( ) this ClientSize = new System Drawing Size( ) button Location = new System Drawing Point( ) button Size = new System Drawing Size( ) button TabIndex = ; button Anchor = System WinForms AnchorStyles TopLeftRight; button Text = Cancel ; button Location = new System Drawing Point( ) button Size = new System Drawing Size( ) button TabIndex = ; button Anchor = System WinForms AnchorStyles All; button Text = Filler ; button Location = new System Drawing Point( ) button Size = new System Drawing Size( ) button TabIndex = ; button Anchor = System WinForms AnchorStyles TopLeftRight; button Text = OK ; listBox Size = new System Drawing Size( ) listBox Dock = System WinForms DockStyle Left; listBox TabIndex = ; listBox Items All = new object[] { Item One Item Two Item Three Item Four }; this Controls Add(button ) this Controls Add(button ) this Controls Add(button ) this Controls Add(listBox ) } } } lishixinzhi/Article/program/net/201311/13232
vshost顾名思义,是visual studio宿主应用程序,vs运行调试时是打开的其实是这个文件,这个程序可以让vs跟踪调试信息。
而exe则可以直接打开,vs不会跟踪任何这个文件的运行情况。只要引用的程序集完整,可直接运行。
你会不会是在vs上正做着调试没关呀,所以才会看到这个进程
并发性、共享性、虚拟性、异步性。
并发:指两个或多个事件在同一时间间隔内发生,这些事件宏观上是同时发生的,但在微观上是交替发生的。并行:指两个或多个事件在同一时刻发生。 *** 作系统的并发性:指计算机系统中“同时”地运行着多个程序,这些程序宏观上是同时运行的,在微观上是交替运行的。 *** 作系统和程序并发是一起诞生的。我们的计算机的CPU有单核的,双核的,四核的,八核的!单核CPU同一时刻只能运行一个程序,各个程序只能并发地执行(交替地使用CPU)!多核CPU同一时刻可以执行多个程序,多个程序可以并行地执行(同时发生运行)。共享:即资源共享,是指系统中的资源可供内存中多个并发执行的进程中同时使用。所谓“同时”,往往是宏观上的,而在微观上,这些进程可能是交替地对资源进行访问的(即分时共享)。两种资源共享方式:互斥共享方式和同时共享方式。互斥共享方式:系统中的某些资源,虽然可以提供给多个进程使用,但一个时间段内只允许一个进程访问该资源。同时共享方式:系统中的某些资源,允许一个时间段内由多个进程“同时”对它们进行访问。并发性和共享性互为存在条件的。虚拟:是指一个物理上的实体变为若干个逻辑上的对应物,物理实体(前者)是实际存在的,而逻辑上对应物(后者)是用户感受到的。异步:在多道程序环境下,允许多个程序并发的执行,但由于资源有限,进程的执行不是一管到底的,而是走走停停已不可预知的速度向前推进,这就是进程的异步性!只有系统拥有并发性,才有可能导致异步性,没有并发和共享,就谈不上虚拟和异步。
*** 作系统(OperationSystem,OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织和调度计算机的工作和资源的分配,以提供给用户和其他软件方便地接口和环境,它是计算机系统中最基本的系统软件。用户可以直接和 *** 作系统进行交互,但是大多数情况下都是通过应用软件与 *** 作系统进行交互。硬件指的是CPU、内存、硬盘等资源。
*** 作系统和运行库环境通常会在应用程序间提供某种形式的隔离。例如,Microsoft Windows 使用进程来隔离应用程序。为确保在一个应用程序中运行的代码不会对其他不相关的应用程序产生不良影响,这种隔离是必需的。
应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。
简单说下原理吧:
假设A程序以及运行,需要在A中放一个容器(A本身也可以)去存放一会将要运行的B程序。
启动B程序,并获取B程序的句柄,这个需要调用Win32 API,引用如下
[DllImport("user32dll", EntryPoint = "FindWindow")]
public static extern int FindWindow(
string lpClassName,
string lpWindowName
);
3 还是调用Win32 API,将A程序的容器设置成B容器的父对象,引用如下
[DllImport("user32dll", EntryPoint = "SetParent")]
public static extern int SetParent(
int hWndChild,
int hWndNewParent
);
A程序中的代码:
SystemDiagnosticsProcessStart("Bexe");
SetParent(FindWindow(null, "B程序的Title"), thisHandleToInt32());
当然了,获取B程序的句柄,办法更多,直接用processinfo最好,只需要一句代码即可:
SetParent(SystemDiagnosticsProcessStart("Bexe")Handle, thisHandleToInt32());
我这个就是VBNET的代码
Imports System
Imports SystemReflection
Imports SystemRuntimeSerialization
Imports SystemRuntimeSerializationFormatters
Imports SystemRuntimeSerializationFormattersBinary
Imports SystemRuntimeCompilerServices
Imports SystemRuntimeRemoting
Imports SystemRuntimeRemotingChannels
Imports SystemRuntimeRemotingChannelsTcp
Imports SystemRuntimeRemotingMessaging
Namespace LearnLibraryRemoting
Public Class RemotingTest ' '// <summary>
' '/ 远程类型
' '/ </summary>
' Public class Data : MarshalByRefObject
' {
' private Integer i
'
' Public Integer I
' {
' get
' {
' Return i
' }
'
' set
' {
' i = value
' }
'
' }
'
' Public void Where()
' {
' ConsoleWriteLine("{0} in {1}", MeGetType()Name, AppDomainCurrentDomainFriendlyName)
' }
' }
'
' /'// <summary>
' '/ 服务器端代码
' '/ </summary>
' static void Server()
' {
' ' 创建新的应用程序域,以便模拟分布系统。
' AppDomain server = AppDomainCreateDomain("server")
' serverDoCallBack(delegate
' {
' ' 创建并注册信道
' TcpServerChannel channel = New TcpServerChannel(801)
' ChannelServicesRegisterChannel(channel, False)
'
' ' 注册远程对象激活模式
' RemotingConfigurationRegisterWellKnownServiceType(TypeGetType(Data), "data",
' WellKnownObjectModeSingleton)
'
' }
' )
' }
'
' /'// <summary>
' '/ 客户端代码
' '/ </summary>
' static void Client()
' {
' ' 创建并注册信道
' TcpClientChannel channel = New TcpClientChannel()
' ChannelServicesRegisterChannel(channel, False)
'
' ' 创建远程对象并调用其方法
' Data data = CType(ActivatorGetObject(TypeGetType(Data), "tcp://localhost:801/data"), Data)
' dataWhere()
'
' ' 判断是否是代理
' ConsoleWriteLine(RemotingServicesIsTransparentProxy(data))
' }
'
' static void Main()
' {
' Server()
' Client()
' }
' }
'
End Class
{ ' '// <summary>
' '/ 远程类型
' '/ </summary>
' Public class Data : MarshalByRefObject
' {
' private Integer i
'
' Public Integer I
' {
' get
' {
' Return i
' }
'
' set
' {
' i = value
' }
'
' }
'
' Public void Where()
' {
' ConsoleWriteLine("{0} in {1}", MeGetType()Name, AppDomainCurrentDomainFriendlyName)
' }
' }
'
' /'// <summary>
' '/ 服务器端代码
' '/ </summary>
' static void Server()
' {
' ' 创建新的应用程序域,以便模拟分布系统。
' AppDomain server = AppDomainCreateDomain("server")
' serverDoCallBack(delegate
' {
' ' 创建并注册信道
' TcpServerChannel channel = New TcpServerChannel(801)
' ChannelServicesRegisterChannel(channel, False)
'
' ' 注册远程对象激活模式
' RemotingConfigurationRegisterWellKnownServiceType(TypeGetType(Data), "data",
' WellKnownObjectModeSingleton)
'
' }
' )
' }
'
' /'// <summary>
' '/ 客户端代码
' '/ </summary>
' static void Client()
' {
' ' 创建并注册信道
' TcpClientChannel channel = New TcpClientChannel()
' ChannelServicesRegisterChannel(channel, False)
'
' ' 创建远程对象并调用其方法
' Data data = CType(ActivatorGetObject(TypeGetType(Data), "tcp://localhost:801/data"), Data)
' dataWhere()
'
' ' 判断是否是代理
' ConsoleWriteLine(RemotingServicesIsTransparentProxy(data))
' }
'
' static void Main()
' {
' Server()
' Client()
' }
' }
'
End Namespace
{
Public Class RemotingTest ' '// <summary>
' '/ 远程类型
' '/ </summary>
' Public class Data : MarshalByRefObject
' {
' private Integer i
'
' Public Integer I
' {
' get
' {
' Return i
' }
'
' set
' {
' i = value
' }
'
' }
'
' Public void Where()
' {
' ConsoleWriteLine("{0} in {1}", MeGetType()Name, AppDomainCurrentDomainFriendlyName)
' }
' }
'
' /'// <summary>
' '/ 服务器端代码
' '/ </summary>
' static void Server()
' {
' ' 创建新的应用程序域,以便模拟分布系统。
' AppDomain server = AppDomainCreateDomain("server")
' serverDoCallBack(delegate
' {
' ' 创建并注册信道
' TcpServerChannel channel = New TcpServerChannel(801)
' ChannelServicesRegisterChannel(channel, False)
'
' ' 注册远程对象激活模式
' RemotingConfigurationRegisterWellKnownServiceType(TypeGetType(Data), "data",
' WellKnownObjectModeSingleton)
'
' }
' )
' }
'
' /'// <summary>
' '/ 客户端代码
' '/ </summary>
' static void Client()
' {
' ' 创建并注册信道
' TcpClientChannel channel = New TcpClientChannel()
' ChannelServicesRegisterChannel(channel, False)
'
' ' 创建远程对象并调用其方法
' Data data = CType(ActivatorGetObject(TypeGetType(Data), "tcp://localhost:801/data"), Data)
' dataWhere()
'
' ' 判断是否是代理
' ConsoleWriteLine(RemotingServicesIsTransparentProxy(data))
' }
'
' static void Main()
' {
' Server()
' Client()
' }
' }
'
End Class
{ ' '// <summary>
' '/ 远程类型
' '/ </summary>
' Public class Data : MarshalByRefObject
' {
' private Integer i
'
' Public Integer I
' {
' get
' {
' Return i
' }
'
' set
' {
' i = value
' }
'
' }
'
' Public void Where()
' {
' ConsoleWriteLine("{0} in {1}", MeGetType()Name, AppDomainCurrentDomainFriendlyName)
' }
' }
'
' /'// <summary>
' '/ 服务器端代码
' '/ </summary>
' static void Server()
' {
' ' 创建新的应用程序域,以便模拟分布系统。
' AppDomain server = AppDomainCreateDomain("server")
' serverDoCallBack(delegate
' {
' ' 创建并注册信道
' TcpServerChannel channel = New TcpServerChannel(801)
' ChannelServicesRegisterChannel(channel, False)
'
' ' 注册远程对象激活模式
' RemotingConfigurationRegisterWellKnownServiceType(TypeGetType(Data), "data",
' WellKnownObjectModeSingleton)
'
' }
' )
' }
'
' /'// <summary>
' '/ 客户端代码
' '/ </summary>
' static void Client()
' {
' ' 创建并注册信道
' TcpClientChannel channel = New TcpClientChannel()
' ChannelServicesRegisterChannel(channel, False)
'
' ' 创建远程对象并调用其方法
' Data data = CType(ActivatorGetObject(TypeGetType(Data), "tcp://localhost:801/data"), Data)
' dataWhere()
'
' ' 判断是否是代理
' ConsoleWriteLine(RemotingServicesIsTransparentProxy(data))
' }
'
' static void Main()
' {
' Server()
' Client()
' }
' }
' }
'
'
'
'
'
以上就是关于利用.NET Framework创建基于Windows的应用程序全部的内容,包括:利用.NET Framework创建基于Windows的应用程序、*.vshost.exe程序有什么作用、 *** 作系统的基本特征等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)