Ricevo "System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto." sul mio rilascio build. Ho creato un'applicazione di esempio che imita ciò che c'è nel mio codice di produzione.NullReferenceException in VS2015 C++/CLI Release Build
void Abc::LogService::Log(String^ message)
{
try
{
int ret = DoProcessing(message);
Exception^ ex;
if (ret == 0)
{
ex = gcnew ArgumentException("Processing done.");
}
else
{
ex = gcnew ArgumentNullException("message", "Null args");
}
throw ex;
}
finally
{
//do someother thing.
}
}
Con il codice di cui sopra, si segnala la linea di deroga sia: at Abc.LogService.Log(String message) in logservice.cpp:line 19
che corrisponde alla throw ex;
dichiarazione nel codice.
Il MSIL nel build di rilascio per questa funzione appare come:
.method public hidebysig instance void Log(string message) cil managed
{
// Code size 46 (0x2e)
.maxstack 4
.locals ([0] class [mscorlib]System.Exception V_0,
[1] class [mscorlib]System.Exception ex)
.try
{
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: call instance int32 Abc.LogService::DoProcessing(string)
IL_0007: ldnull
IL_0008: stloc.1
IL_0009: brtrue.s IL_0018
IL_000b: ldstr "Processing done."
IL_0010: newobj instance void [mscorlib]System.ArgumentException::.ctor(string)
IL_0015: stloc.0
IL_0016: br.s IL_0028
IL_0018: ldstr "message"
IL_001d: ldstr "Null args"
IL_0022: newobj instance void [mscorlib]System.ArgumentNullException::.ctor(string,
string)
IL_0027: stloc.0
IL_0028: ldloc.1
IL_0029: throw
IL_002a: leave.s IL_002d
} // end .try
finally
{
IL_002c: endfinally
} // end handler
IL_002d: ret
} // end of method LogService::Log
Dal codice MSIL, dimostra che per la dichiarazione IL_0028, si carica di un valore nullo e chiama il tiro nella dichiarazione successiva. La parte strana è che ciò accade solo se ho il blocco try-finally. La compilazione del debug del codice precedente funziona correttamente.
Suona come un bug nel toolkit VS1015 v140?