Я получаю сообщение «Указанное приведение недействительно» при выполнении только сборки выпуска из MSBuild 4.0. Я проверил это, используя сборку выпуска Visual Studio 2012, и не получил этой проблемы. Я также проверил это с помощью отладочной сборки из MSBuild 4.0 и не получил этой проблемы.
Исключение:
Код
public abstract class CachedSessionBase : ISessionObject
{
protected Dictionary<MethodBase, Object> _getAndSetCache = new Dictionary<MethodBase, object>();
protected TResult SetAndGet<TResult>(ObjectFactory factory, Func<TResult> func)
{
StackTrace stackTrace = new StackTrace();
var methodBase = stackTrace.GetFrame(1).GetMethod();
if (!_getAndSetCache.ContainsKey(methodBase))
{
_getAndSetCache[methodBase] = func.Invoke();
}
return (TResult)_getAndSetCache[methodBase];
}
Ошибка вылетает в этой строке
return (TResult)_getAndSetCache[methodBase];
_getAndSetCache[methodBase]
, на самом деле имеет типTResult
. В конфигурации выпуска (с включенной оптимизацией) кадр стека может измениться, если методы встроены.stackTrace.GetFrame(1).GetMethod()
‹-- такой код не должен запускаться в производство. Существует атрибут, который вы можете применить к членам, чтобы остановить встраивание, но я не могу вспомнить, что это такое... видел, как он использовался в CSLA.NET старого. - person Adam Houldsworth   schedule 09.01.2013stackTrace.GetFrame(1).GetMethod()
возвращает что-то другое в выпуске, чем в отладке. Я бы посоветовал не использовать его, но не могу предложить никаких альтернатив. - person Adam Houldsworth   schedule 09.01.2013