2016-04-05 3 views
0

Я получаю эту ошибку времени выполнения: InvalidProgramException: Invalid IL code. Я использую единство 5.3.1f1. Проект является расширением редактора. Упрощенная версия кода:InvalidProgramException: Недействительный код IL при вызове метода

public unsafe class PPAGraph 
{ 
    PaddedImage downSampleImage; 
    int downSampleRate; 
    internal void Calculate(PaddedImage sourceImage) 
    { 
    sourceImage.DownSample(downSampleImage, downSampleRate); 
    } 

Эта ошибка возникает в этой строке.

InvalidProgramException: Invalid IL code in Assets.UPlus.TerrEngine.PaddedImage:DownSample (Assets.UPlus.TerrEngine.PaddedImage,int): IL_00a9: stloc.s 15

Assets.UPlus.TerrEngine.PPAGraph.Calculate (Assets.UPlus.TerrEngine.PaddedImage sourceImage, Boolean isRidge, Boolean sketch, Int32 plength, Int32 portion) (at Assets/UPlus/TerrEngine/Engine/PPA/PPAGraph.cs:1311) Assets.UPlus.Utils.TerraGodContext.CalcSketchPpa (Assets.UPlus.TerrEngine.PaddedImage sketchImg, Int32 sketchDownSampleRate) (at Assets/UPlus/TerrEngine/UnityEngine/TerraGodContext.cs:70) EditorExtensions.Editor.TerrainGodMainPanel.CreatePanel() (at Assets/UPlus/TerrEngine/Engine/Editor/TerrainGODMainPanel.cs:45) EditorExtensions.Editor.TerrainGODWindow.OnGUI() (at Assets/UPlus/TerrEngine/Engine/Editor/TerrainGODWindow.cs:39) System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

Метод Downsample является:

 public void DownSample(PaddedImage downSampImg, int downsampleRate) 
    { 
     int dsW = downSampImg.Width; 
     int dsH = downSampImg.Height; 
     float* dsPix = downSampImg.Pixels,padDSPix=downSampImg.PaddedPixels; 
     int pad = Padding; 
     int twoPad = pad + pad; 
     float* rowMyPix = PaddedPixels; 
     rowMyPix += pad*PaddedWidth + pad; 
     float* myPix; 
     int yStep = downsampleRate * PaddedWidth; 
     int dsPad = downSampImg.Padding; 
     int twoDSPad = dsPad + dsPad; 
     padDSPix += downSampImg.PaddedWidth*dsPad + dsPad; 
     if (downSampImg.PixelsPtr != IntPtr.Zero) 
     { 
      for (int y = 0; y < dsH; y++) 
      { 
       myPix = rowMyPix; 
       for (int x = 0; x < dsW; x++) 
       { 
        *padDSPix++ = *dsPix++ = *myPix; 
        myPix += downsampleRate; 
       } 
       padDSPix += twoDSPad; 
       rowMyPix += yStep; 
      } 
     } 
     else 
     { 
      for (int y = 0; y < dsH; y++) 
      { 
       myPix = rowMyPix; 
       for (int x = 0; x < dsW; x++) 
       { 
        *padDSPix++ = *dsPix++ = *myPix; 
        myPix += downsampleRate; 
       } 
       padDSPix += twoDSPad; 
       rowMyPix += yStep; 
      } 
     } 
    } 
+0

Вы используете Unity с Mono в Linux? –

+0

Нет, это на окнах 7. Проект был прекрасен, но после некоторых изменений кода, а также с понижением моей визуальной студии до 2013 года и переходом к 9, появилась ошибка. Я не знаю, изменился ли код там, где была причина, или если это было понижение. Затем я установил vs 2015 и снова resharper 10, и ошибка осталась. Попробовал пару версий unityvs и даже установил свежие окна. И сделал пакет из проекта, и создал другой проект и импортировал пакет. Это также не решило проблему. –

+0

Мне интересно, из-за 'at/Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs' –

ответ

0

Найдено решение. Речь шла не о настройке проекта.

Проблема с линией *padDSPix++ = *dsPix++ = *myPix;. Преобразование его в два отдельных заявления решило проблему.

pixH = *myPix; 
*padDSPix++ = pixH; 
*dsPix++ = pixH; 

Интересно посмотреть, насколько сообщение об ошибке является общим и вводящим в заблуждение.

Смежные вопросы