关于DLL的调用问题,高手指点一下。 我用vs2005做了一个winform应用程序,编译后只有一个可执行文件(test.exe),现在我要用到一个dll,能不能把dll合成到exe可执行文件中去,因为我编译后只想生成一个可执行文件。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 理论上是可以的,把DLL做为一个文本写到你的一个或多个字段中.然后以虚拟机的方式读到内存.然后调用,不过我也没试过,哈哈 这个你要对WINDOWS加载器有一定了解,也就是把PE文件读入内存的方式.然后还要对C#的CLR有一定了解.这样可以用来调用一些方法.具体怎么,我没有做过.只是理论.呵呵,所以有什么想法,可以在这里说说. 可以做到DLL文件是.NET做的吗?DLL文件是自始至终被*.EXE使用,还是用一下,就不用了? dll是别人写的,你没有源代码吧?那就不好办了。。不过应该还是有办法的。 最简单的方法:下载一个ILMerge(网上很容易搜到),直接合并就行了还有一种方法(我自己独创的,我还没见过有别人用的):(如果你不懂反射,用第一种方法就行了)将dll作为资源添加到exe中,然后在exe的初始化的时候,注册一个事件:AppDomain.AssemblyResolve+=(sender,args)=> Assembly.Load(bytes);其中bytes是byte[]类型,是资源文件的字节数组 AppDomain.CurrentAppDomain.AssemblyResolve+=(sender,args)=> Assembly.Load(bytes); Assembly.Load 方法 (array<Byte>[]()[], array<Byte>[]()[]) rawAssembly类型:array<System..::.Byte>[]()[]byte 类型的数组,它是包含已发出程序集的基于 COFF 的图像。 rawSymbolStore类型:array<System..::.Byte>[]()[]byte 类型的数组,它包含表示程序集符号的原始字节。 以前跟同事讨论过这个问题, 说是把Dll动态库当作资源来包装一下就行了. 不过我没有具体实现过. byte[] buf= File.ReadAllBytes("Mylibrary.dll"); //可以从文件、资源、数据库等处存放读取 Assembly ass = Assembly.Load(buf); object obj = ass.CreateInstance("MyLibrary.MyClass"); Debug.WriteLine(obj.GetType().FullName); 如果把dll放在资源文件中,编译到一起,程序启动后,把dll读到内存中,从内存中动态加载,不知道是否可行?? 没看到soaringbird的回答,谢谢了。 我不知道你在想啥,9楼说得那么清楚了,还寻思啥呢?程序员嘛反应要快嘛,不会编程,难道ILMerge.exe工具都不会用? 对楼主无语了......我给你了非常完美的两个方法,你偏要用反射调用,如果这个dll里函数比较多,我看你咋调......现在搞.Net的,只要不给他完整的代码,就一点也不会,真是世风日下啊........ winform界面卡死问题 求解,如何在后台获取远程ajax返回的json? 关于WCF基础 日历 过期 不可选 VS2005做的winform,.net版本是多少? website类型的项目如何设置/unsafe编译开关? 求教简单的windows应用程序弹出窗口 一个网站,进入首页速度很慢,不知道是什么原因?请进。。。。谢谢 98下录音的问题(急!!!) 怎么给继承类的属性赋值?(着急) 二维数组排序,如何按第二进行排序呀 WMI获取硬盘已使用时间
DLL文件是自始至终被*.EXE使用,还是用一下,就不用了?
最简单的方法:下载一个ILMerge(网上很容易搜到),直接合并就行了
还有一种方法(我自己独创的,我还没见过有别人用的):
(如果你不懂反射,用第一种方法就行了)
将dll作为资源添加到exe中,然后在exe的初始化的时候,注册一个事件:
AppDomain.AssemblyResolve+=(sender,args)=> Assembly.Load(bytes);
其中bytes是byte[]类型,是资源文件的字节数组
rawAssembly
类型:array<System..::.Byte>[]()[]byte 类型的数组,它是包含已发出程序集的基于 COFF 的图像。 rawSymbolStore
类型:array<System..::.Byte>[]()[]byte 类型的数组,它包含表示程序集符号的原始字节。
Assembly ass = Assembly.Load(buf); object obj = ass.CreateInstance("MyLibrary.MyClass");
Debug.WriteLine(obj.GetType().FullName);
我不知道你在想啥,9楼说得那么清楚了,还寻思啥呢?程序员嘛反应要快嘛,不会编程,难道ILMerge.exe工具都不会用?
对楼主无语了......我给你了非常完美的两个方法,你偏要用反射调用,如果这个dll里函数比较多,我看你咋调......现在搞.Net的,只要不给他完整的代码,就一点也不会,真是世风日下啊........