我用vs2005做了一个winform应用程序,编译后只有一个可执行文件(test.exe),现在我要用到一个dll,能不能把dll合成到exe可执行文件中去,因为我编译后只想生成一个可执行文件。

解决方案 »

  1.   

    理论上是可以的,把DLL做为一个文本写到你的一个或多个字段中.然后以虚拟机的方式读到内存.然后调用,不过我也没试过,哈哈
      

  2.   

    这个你要对WINDOWS加载器有一定了解,也就是把PE文件读入内存的方式.然后还要对C#的CLR有一定了解.这样可以用来调用一些方法.具体怎么,我没有做过.只是理论.呵呵,所以有什么想法,可以在这里说说.
      

  3.   

    可以做到DLL文件是.NET做的吗?
    DLL文件是自始至终被*.EXE使用,还是用一下,就不用了?
      

  4.   

    dll是别人写的,你没有源代码吧?那就不好办了。。不过应该还是有办法的。
      

  5.   


    最简单的方法:下载一个ILMerge(网上很容易搜到),直接合并就行了
    还有一种方法(我自己独创的,我还没见过有别人用的):
    (如果你不懂反射,用第一种方法就行了)
    将dll作为资源添加到exe中,然后在exe的初始化的时候,注册一个事件:
    AppDomain.AssemblyResolve+=(sender,args)=> Assembly.Load(bytes);
    其中bytes是byte[]类型,是资源文件的字节数组
      

  6.   

    AppDomain.CurrentAppDomain.AssemblyResolve+=(sender,args)=> Assembly.Load(bytes); 
      

  7.   

    Assembly.Load 方法 (array<Byte>[]()[], array<Byte>[]()[]) 
    rawAssembly
    类型:array<System..::.Byte>[]()[]byte 类型的数组,它是包含已发出程序集的基于 COFF 的图像。 rawSymbolStore
    类型:array<System..::.Byte>[]()[]byte 类型的数组,它包含表示程序集符号的原始字节。 
      

  8.   

    以前跟同事讨论过这个问题, 说是把Dll动态库当作资源来包装一下就行了. 不过我没有具体实现过.
      

  9.   

    byte[] buf= File.ReadAllBytes("Mylibrary.dll"); //可以从文件、资源、数据库等处存放读取
                Assembly ass = Assembly.Load(buf);            object obj = ass.CreateInstance("MyLibrary.MyClass");
                Debug.WriteLine(obj.GetType().FullName);
      

  10.   

    如果把dll放在资源文件中,编译到一起,程序启动后,把dll读到内存中,从内存中动态加载,不知道是否可行??
      

  11.   

    没看到soaringbird的回答,谢谢了。
      

  12.   


    我不知道你在想啥,9楼说得那么清楚了,还寻思啥呢?程序员嘛反应要快嘛,不会编程,难道ILMerge.exe工具都不会用?
      

  13.   


    对楼主无语了......我给你了非常完美的两个方法,你偏要用反射调用,如果这个dll里函数比较多,我看你咋调......现在搞.Net的,只要不给他完整的代码,就一点也不会,真是世风日下啊........