none
为什么Win8.1中安装x64位服务,会报错:“System.BadImageFormatException: 未能加载文件或程序集”? RRS feed

  • 问题

  • 为什么Win8.1中安装x64位服务,会报错:“System.BadImageFormatException: 未能加载文件或程序集”?而将目标平台,由x64改成“Any CPU",就可以顺利安装?我是否应该在代码中注意些什么? 因为总要开发x64程序。
    2013年12月15日 9:41

答案

全部回复

  • 为什么Win8.1中安装x64位服务,会报错:“System.BadImageFormatException: 未能加载文件或程序集”?而将目标平台,由x64改成“Any CPU",就可以顺利安装?我是否应该在代码中注意些什么? 因为总要开发x64程序。

    所有用到的库,都是用C#写的托管程序。所有需要用到的DLL都是用.net4写的,其中大多因为使用Parallel.For。服务是TcpListener,监听的端口会传送一些大于4G的文件,文件在内存中反序列化。因为文件大于4G,所以要x64,免得内存报溢出。Win本身是64bit的。

    我起初怀疑是编译平台导致:“System.OutOfMemoryException”类型的未经处理的异常在 mscorlib.dll 中发生 的报错。但我又想了想,估计是不断Add()超过了ArrayList的容量。我用以下方式,实现监听和接收:

                        ZiKu[] TcpZiKu = new ZiKu[0]; // 目标类型数组
                        ArrayList ContentAL = new ArrayList();
                        byte[] Buffer = new byte[BufferSize];
                        TcpClient tcpClient = myTcpListener.AcceptTcpClient();
                        NetworkStream netStream = tcpClient.GetStream();
                        BytesLength = netStream.Read(Buffer, 0, Buffer.Length);
                        while (BytesLength != 0)
                        {
                            for (int i = 0; i < Buffer.Length; i++)
                                ContentAL.Add(Buffer[i]);  //因不知道接收的文件到底有多长,所以用队列实现动态可追加的数组。
                            BytesLength = netStream.Read(Buffer, 0, Buffer.Length);
                            //  end while (BytesLength !=0)
                        }
                        netStream.Close();
                        tcpClient.Close();
                        Buffer = new byte[ContentAL.Count];
                        Parallel.For(0, Buffer.Length, tid =>
                        {
                            Buffer[tid] = (byte)ContentAL[tid];
                        });
                        ContentAL.Clear();
                        try
                        {
                            MemoryStream ms = new MemoryStream();
                            ms.Write(Buffer, 0, Buffer.Length);
                            ms.Position = 0;
                            BinaryFormatter bf = new BinaryFormatter();
                            TcpZiKu = bf.Deserialize(ms) as ZiKu[];
                            //  end try
                        }
                        catch (Exception error)
                        {
                            //  应该取得源发送地址,向源发送报文提示错误内容
                        }
                        finally
                        {
                            if (TcpZiKu != null)
                                if (TcpZiKu.Length > 0)
                                    ZiKuArray_Insert_Buffer(TcpZiKu);  //如果反序列化的结果有效,则将信息传入一个Insert缓冲。
                            //  end finally
                        }

    问题:

    1)我接收的文件可能会超过4GB,这种情况下,我该如何动态接收,但又不浪费内存。先内存16GB。

    2)还有别的,效率比较好的动态数组类型可选吗?

    谢谢!

    2013年12月15日 12:46
  • ArrayList的问题解决了,跳过ArrayList.Add(),将Buffer直接写入MemoryStream。
    • 已标记为答案 OpenNovo 2013年12月17日 6:30
    2013年12月16日 3:56
  • 谢谢分享经验。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2013年12月17日 11:14
    版主