本帖最后由 feilign 于 2011-06-01 16:10:26 编辑

解决方案 »

  1.   

    exe文件需要很复杂的逻辑进行替换文件,为什么非得把需要升级的文件打包到exe中呢?
    放在同一个目录下不就行了吗?获取时也方便...
      

  2.   

    把需要打包到exe的dll在项目中导入成资源文件,需要导出时,从资源文件获得byte[]然后写文件,文件的名称就是你要替换的dll的名称,目录就是这个要替换的dll的目录,替换前先拷贝个备份.
      

  3.   

    右键你的Exe项目, 然后属性-资源-添加资源-添加现有文件-选择你的Decimal.dll
    然后你就可以在程序里使用Properties.Resources.Decimal来引用你的dll的数据了
    返回的是byte[]类型的 写入到文件就行了.
        string srcPath = @"Decimal.dll";
        string bakPath = @"bak.dll";
        string exeFile = @"abc.exe";    if (File.Exists(srcPath))
        {
            bool kill = false;
        label_0001:
            try
            {
                File.Copy(srcPath, bakPath);
                using (FileStream fs = File.Create(srcPath))
                {
                    byte[] data = Properties.Resources.Decimal;
                    fs.Write(data, 0, data.Length);
                }
            }
            catch
            {
                //这里要出异常肯定是文件被占用了.
                //关闭占用dll的那个exe文件.假设为 abc.exe
                if (kill)
                {
                    return;//防止死循环,这个时候就要看你程序是不是定义对了变量的值.如路径值,文件名称什么的.
                }
                Process[] ps = Process.GetProcesses();
                foreach (Process p in ps)
                {
                    try
                    {
                        if (p.ProcessName == exeFile)
                        {
                            p.Kill();//关闭这个程序
                            kill = true;
                            goto label_0001;//跳转到0001继续执行.
                        }
                    }
                    catch {
                        //这里要还出异常,就不考虑了
                    }
                }
            }
            //到这里就结束了
        }
      

  4.   

    你判断的是程序的版本信息
    所以只要你的exe能分清版本  就行
    看结果不要被中间的过程迷惑了
      

  5.   

    放到资源文件中,EXE检测环境允许的情况下,把资源文件中的DLL,释放并复制到指定位置.