【发布时间】:2013-01-09 16:08:30
【问题描述】:
当仅从 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() -
澄清一下,我认为问题在于
stackTrace.GetFrame(1).GetMethod()在发布时返回的内容与调试时不同。我建议不要使用它,但不能提供任何替代方案。 -
可以在返回之前记录下对象的类型吗?
-
StackTrace 永远不应该在生产代码中使用。唯一罕见的例外是错误处理/日志记录,它试图对发生的事情进行更智能的分析(即使那样我也会质疑正在做的事情的有效性)
标签: c# .net visual-studio msbuild il