C#自身包含其他应用程序(或者文件)并在运行时调用
2011-09-21 13:23
363 查看
转自/article/11395593.html
kangkanglx
今天一个同事问我,怎么把Dll动态链接库直接嵌入到C#开发的应用程序本身,让C#在发布出去的时候,只是一个.exe的文件,而不是一个文件夹。我仔细思索了一下这个问题。发现这个问题其实可以总结为一个比较普遍的问题,那就是怎样把不同种类的文件包含到C#开发的应用程序自身内,然后变成一个.exe的文件给用户发布出去。
其实,思路还是比较简单的,我们首先把需要包含到应用程序本身的文件作为外部的资源文件加入到程序中,然后在程序运行的时候,由程序自己自动把资源文件给释放出来,实际上就达到了,即可包含不同文件在应用程序内,又可以随时释放该文件并使用的目的。
(1)首先,我们使用VS2005新建一个WindowsForm的开发程序(说个题外话,虽然现在我在公司用的都是VS2010了,但是我还是喜欢VS2005,因为我觉得,只要VS2005都运行的起的程序,VS2010肯定也可以运行。不过,最主要的还是因为我家这个电脑太恼火了,拖起VS2005都已经很卡了,所以就没有装VS2010了)。
(2)然后,我们为了测试一个Dll包含到应用程序本身,并保证该应用程序在调用该Dll以后正常运行,我现在用VS里面提供的带DLL的控件,Media Player做一个演示。现在我们要添加该控件,选择‘菜单’-‘工具’-‘工具箱项’,如下图:
(3)我们选择COM选项卡,选择Media Player 这个mp3播放控件,选择完成后,我们会在工具箱中,发现新添加的这个Media Player控件。
(4)于是我们直接把这个控件,拖动到WindowForm窗体上。此时,一个播放器,就弄好了。
(5)这个时候我们编译这个应用程序,会发现,在我们应用程序Bin/Debug目录下,不但有KContainer这个应用程序,还有2个dll和MediaPlayer相关的动态链接库。
(6)按照常理来说,如果我们要发布我们的这个播放器应用程序,我们就必须把额外的这个两个dll文件包含在和这个应用程序一样的文件目录。但是这样的话,太影响美观,而且也不便于传输给别人使用,毕竟这样看起来平白无故的要多了2个文件,那么我们如何才能让我们自己只发布一个KContainer程序给别人,然后这个应用程序能照样正常使用我们这个播放器呢?答案实际上很简单,我们只需要在我们使用的时候把这个两个文件释放出来,不使用的时候删除就行了。既然要释放,那就涉及到包含。要包含很容易就想到资源文件了,所以,现在我们要把这两个Dll动态链接库,作为KContainer的资源文件包含在KContainer里面。当然其他文件类型的包含也是一样的,只不过这里包含的是Dll文件。我反正成功包含过EXE文件(又给一些想做病毒的同胞们提供了思路了。。。。)。
(6, 1)我们首先把这个两个动态链接库,以资源的形式导入到我们的工程文件中。在这里,我先建立一个MyDll的文件夹用于存放这两个文件。
(6, 2)然后,我们引入刚才我们生成的两个DLL动态链接库文件(其他文件格式的包含方式如同这个两个DLL的操作步骤一样)
(6,2,1)引入这两个动态链接库
(6,2,1)
(6,2,2)引入后修改这两个动态链接库的属性为嵌入资源
(6,2,2)
(6, 3)到此,所有工作都已经准备就绪了,剩下的工作,就是等待在窗体自己启动的时候,把这两个DLL释放出来,然后,就可以大功告成了。不过一定要记住,释放的代码必须要放在构造函数里面且放在控件初始化代码之前,否则在控件在初始化的时候找不到动态链接库,程序会无情的被操作系统结束掉,当然最后使用完这些链接库的删除,在这个地方就不在叙述了。以下为释放出这两个资源的代码。
(7)现在我们编译调试,然后把生成的KContainer.exe应用程序拷贝到其他地方运行一下,会发现,当我们运行这个应用程序的时候,这个程序会自动释放这两个Dll动态链接库出来。感觉是不是很爽?其实所有文件比如什么DOC,XLS,EXE,TXT等格式的文件都可以这样操作,把他们包含在这一个应用程序里面,然后在需要的时候释放他们,这个时候,你要传给人家的只是一个exe文件而已。
工程文件下载地址(663KB):http://www.aozoz.com/Code/KContainer/KContainer.rar
如有任何问题可以发邮件到:Email:k.liuxu@gmail.com或者加QQ:583936908
以上文章由康康撰写,劳动成果来之不易,转载时请注明出处
kangkanglx
今天一个同事问我,怎么把Dll动态链接库直接嵌入到C#开发的应用程序本身,让C#在发布出去的时候,只是一个.exe的文件,而不是一个文件夹。我仔细思索了一下这个问题。发现这个问题其实可以总结为一个比较普遍的问题,那就是怎样把不同种类的文件包含到C#开发的应用程序自身内,然后变成一个.exe的文件给用户发布出去。
其实,思路还是比较简单的,我们首先把需要包含到应用程序本身的文件作为外部的资源文件加入到程序中,然后在程序运行的时候,由程序自己自动把资源文件给释放出来,实际上就达到了,即可包含不同文件在应用程序内,又可以随时释放该文件并使用的目的。
(1)首先,我们使用VS2005新建一个WindowsForm的开发程序(说个题外话,虽然现在我在公司用的都是VS2010了,但是我还是喜欢VS2005,因为我觉得,只要VS2005都运行的起的程序,VS2010肯定也可以运行。不过,最主要的还是因为我家这个电脑太恼火了,拖起VS2005都已经很卡了,所以就没有装VS2010了)。
(2)然后,我们为了测试一个Dll包含到应用程序本身,并保证该应用程序在调用该Dll以后正常运行,我现在用VS里面提供的带DLL的控件,Media Player做一个演示。现在我们要添加该控件,选择‘菜单’-‘工具’-‘工具箱项’,如下图:
(3)我们选择COM选项卡,选择Media Player 这个mp3播放控件,选择完成后,我们会在工具箱中,发现新添加的这个Media Player控件。
(4)于是我们直接把这个控件,拖动到WindowForm窗体上。此时,一个播放器,就弄好了。
(5)这个时候我们编译这个应用程序,会发现,在我们应用程序Bin/Debug目录下,不但有KContainer这个应用程序,还有2个dll和MediaPlayer相关的动态链接库。
(6)按照常理来说,如果我们要发布我们的这个播放器应用程序,我们就必须把额外的这个两个dll文件包含在和这个应用程序一样的文件目录。但是这样的话,太影响美观,而且也不便于传输给别人使用,毕竟这样看起来平白无故的要多了2个文件,那么我们如何才能让我们自己只发布一个KContainer程序给别人,然后这个应用程序能照样正常使用我们这个播放器呢?答案实际上很简单,我们只需要在我们使用的时候把这个两个文件释放出来,不使用的时候删除就行了。既然要释放,那就涉及到包含。要包含很容易就想到资源文件了,所以,现在我们要把这两个Dll动态链接库,作为KContainer的资源文件包含在KContainer里面。当然其他文件类型的包含也是一样的,只不过这里包含的是Dll文件。我反正成功包含过EXE文件(又给一些想做病毒的同胞们提供了思路了。。。。)。
(6, 1)我们首先把这个两个动态链接库,以资源的形式导入到我们的工程文件中。在这里,我先建立一个MyDll的文件夹用于存放这两个文件。
(6, 2)然后,我们引入刚才我们生成的两个DLL动态链接库文件(其他文件格式的包含方式如同这个两个DLL的操作步骤一样)
(6,2,1)引入这两个动态链接库
(6,2,1)
(6,2,2)引入后修改这两个动态链接库的属性为嵌入资源
(6,2,2)
(6, 3)到此,所有工作都已经准备就绪了,剩下的工作,就是等待在窗体自己启动的时候,把这两个DLL释放出来,然后,就可以大功告成了。不过一定要记住,释放的代码必须要放在构造函数里面且放在控件初始化代码之前,否则在控件在初始化的时候找不到动态链接库,程序会无情的被操作系统结束掉,当然最后使用完这些链接库的删除,在这个地方就不在叙述了。以下为释放出这两个资源的代码。
(7)现在我们编译调试,然后把生成的KContainer.exe应用程序拷贝到其他地方运行一下,会发现,当我们运行这个应用程序的时候,这个程序会自动释放这两个Dll动态链接库出来。感觉是不是很爽?其实所有文件比如什么DOC,XLS,EXE,TXT等格式的文件都可以这样操作,把他们包含在这一个应用程序里面,然后在需要的时候释放他们,这个时候,你要传给人家的只是一个exe文件而已。
工程文件下载地址(663KB):http://www.aozoz.com/Code/KContainer/KContainer.rar
如有任何问题可以发邮件到:Email:k.liuxu@gmail.com或者加QQ:583936908
以上文章由康康撰写,劳动成果来之不易,转载时请注明出处
相关文章推荐
- C#自身包含其他应用程序(或者文件)并在运行时调用
- Windows调用其他应用程序或者杀死正在运行或无法手动杀死的进程的方法
- 不安装python运行python文件或者是用其他语言调用python模块的方法
- 怎样才能在C#桌面应用程序(winform)中调用运行EXE文件?
- [VB.NET]vb.net中如何检测一个已知的文件是否已经被打开或者被其他应用程序调用
- .Net/C# 应用程序直接读取本地 Cookies 文件 (由于 WinXP SP2 调用 API: InternetGetCookie 无果)
- C#中调用执行其他应用程序
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- C#运行批处理或者bat文件并且得到输出
- c# 调用c++dll挂钩其他程序线程或者进程
- 驱动中 或者 应用程序中 调用一个 .exe 可执行文件
- C# winform 调用其他语言的Exe文件,并获取返回值
- 用C#调用命令行运行Python文件
- C# winform应用程序运行后,bin文件夹中会自动生成3个文件和一个应用程序
- 在使用C#调用COM组件操作Excel的时候阻止其他程序对此文件操作
- C#窗体应用程序调用ocx文件经验积累
- Java中调用本地的其他文件。运行,命令窗口
- .Net/C#应用程序直接读取本地Cookies文件(由于WinXPSP2调用API:InternetGetCookie无果)
- c#.net调用pdf2swf.exe将pdf文件转换为swf,vs中运行正常,布署IIS服务器部署转换后文字部分为空白
- C# 编译的DLL文件在其他项目中调用时,看不见注释