I've this piece of code:
private void AnswerToCe(int currentBlock, int totalBlock = 0)
{
byte[] bufferToSend;
byte[] macDst = mac;
byte[] macSrc = ConnectionManager.SInstance.GetMyMAC();
byte[] ethType;
byte[] header;
if (Function == FlashFunction.UPLOAD_APPL || Function == FlashFunction.UPLOAD_BITSTREAM)
{
ethType = BitConverter.GetBytes((ushort)EthType.ETH_TYPE_UPLOAD);
ethType = new byte[] { ethType[1], ethType[0] };
header = Header.GetBytes((ushort)binaryBlocks.Count, (ushort)(currentBlock + 1), (ushort)binaryBlocks[currentBlock].Length);
int index = 0;
bufferToSend = new byte[macDst.Length + macSrc.Length + ethType.Length + header.Length + binaryBlocks[currentBlock].Length];
Array.Copy(macDst, 0, bufferToSend, index, macDst.Length);
index += macDst.Length;
Array.Copy(macSrc, 0, bufferToSend, index, macSrc.Length);
index += macSrc.Length;
Logger.SInstance.Write(index.ToString(), "test index pre");
Array.Copy(ethType, 0, bufferToSend, index, ethType.Length);
index += ethType.Length;
Logger.SInstance.Write(index.ToString(), "test index post");
Array.Copy(header, 0, bufferToSend, index, header.Length);
index += header.Length;
Array.Copy(binaryBlocks[currentBlock], 0, bufferToSend, index, binaryBlocks[currentBlock].Length);
}
如果我在Debug模式下构建我的应用程序,一切都很好,
test index pre
打印12和test index post
打印14。如果我使用选中了Optimize code
的Release模式进行测试,那么结果与前者相同。但是如果我勾选Optimize code
并进行测试,test index post
会打印18而不是14。如果将
index += ethType.Length;
替换为index += 2;
,则结果相同。似乎只有index++;index++;
是有效的。我尝试在一个空应用程序中运行此代码,总和是正确的。
应用程序是多线程的,但这里没有并发。
来自DLL的反编译代码看起来很好。
有任何想法为什么会出现这种情况吗?
编辑:
仅在以x64编译应用程序时才会发生。x86没问题。
编辑3:构建环境的一些信息:
Visual Studio 15.0.0-RTW+26228.4
Framework 4.7.02053
可以在Framework 4.6.2和4.7上触发此问题。未测试其他框架。
编辑5:新的、更小的示例项目。不需要依赖项。
编辑6:测试项目的反汇编在这里。(太长了,无法在此发布)
useLegacyJit
似乎有帮助! - vasek