有那位大哥可以教教我,如何调用嵌入的资源中的EXE文件。是这样的,我做一个小程序,abc.exe。然后把另一个程序cat.exe以嵌入的资源方式加入abc.exe中。
请问大哥们,是什么方法可以调用(启动)cat.exe。我只能用
Process.Start("cat.exe");只能abc.exe程序同目录下的运行cat.exe。请大家给我点建议。

解决方案 »

  1.   

    搜索了一下,搜到一篇讲嵌入文本文件,然后读出的,应该可以拿来试试看。
    http://tech.sina.com.cn/s/2005-04-13/0947580532.shtml用流的方式读出,然后保存为可执行文件,然后用
    Process.Start("cat.exe");
    的方法执行。BTW:如果能不保存为文件,直接用流来执行,想想真cool,还是挺有意思的,
    今天晚上想想。呵呵
      

  2.   

    Stream streamObj = this.GetType().Assembly.GetManifestResourceStream("Test_ExeInResource.AllTest.exe"); byte[] b = new byte[streamObj.Length];
    streamObj.Read(b, 0, b.Length); FileStream fileObj = new FileStream("aa.exe", FileMode.CreateNew);
    BinaryWriter writerObj = new BinaryWriter(fileObj);
    fileObj.Write(b, 0, b.Length); fileObj.Close();
    writerObj.Close();
    streamObj.Close();保存成文件的方式。
    直接执行的方式思考&实践中......
      

  3.   

    不读出来保存成exe,执行是不可以的
      

  4.   

    FlashElf(銘龘鶽),话不是随口说说就行的,
    鼓捣了一阵,辛苦没白费,可以直接执行作为资源嵌入的可执行文件,
    目前只是显示出了可执行文件的界面,不知道在复杂程序中用我的办法有没有什么副作用。
    有愿意研究一下的兄弟可以看看我下面的代码:Stream streamObj = this.GetType().Assembly.GetManifestResourceStream("Test_ExeInResource.AllTest.exe");byte[] b = new byte[streamObj.Length];
    streamObj.Read(b, 0, b.Length);Assembly a = Assembly.Load(b);
    Type[] mytypes = a.GetTypes();
    BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | 
    BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);foreach(Type t in mytypes)
    {
    MethodInfo[] mi = t.GetMethods(flags);
    Object obj = Activator.CreateInstance(t); foreach(MethodInfo m in mi)
    {
    if (m.Name == "Main")
    {
    MainDelegate md =
    (MainDelegate)Delegate.CreateDelegate(typeof(MainDelegate), m);

    md.BeginInvoke(null, null);
    }
    }
    }
      

  5.   

    FlashElf(銘龘鶽)说“不读出来保存成exe,执行是不可以的”
    不过事实说明是不对的,鼓捣了一阵,辛苦没有白费,可以直接执行
    作为资源嵌入的可执行文件,目前可以调用嵌入可执行文件的Main方法,
    从而达到执行嵌入可执行文件的目的。
    有兴趣的兄弟可以看看我的代码,欢迎讨论:Stream streamObj = this.GetType().Assembly.GetManifestResourceStream("Test_ExeInResource.AllTest.exe");byte[] b = new byte[streamObj.Length];
    streamObj.Read(b, 0, b.Length);Assembly a = Assembly.Load(b);
    Type[] mytypes = a.GetTypes();
    BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | 
    BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);foreach(Type t in mytypes)
    {
    MethodInfo[] mi = t.GetMethods(flags);
    Object obj = Activator.CreateInstance(t); foreach(MethodInfo m in mi)
    {
    if (m.Name == "Main")
    {
    MainDelegate md =
    (MainDelegate)Delegate.CreateDelegate(typeof(MainDelegate), m);

    md.BeginInvoke(null, null);
    }
    }
    }