“指定的强制转换无效”仅适用于MS版本的发布版本

时间:2013-01-09 16:08:30

标签: c# .net visual-studio msbuild il

当从MSBuild 4.0中仅执行发布版本时,我收到“指定的强制转换无效”有效。我在使用Visual Studio 2012的发布版本时对此进行了测试,但没有遇到此问题。我还使用MSBuild 4.0的调试版本对此进行了测试,但没有遇到此问题。

例外:enter image description here

代码

    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];

2 个答案:

答案 0 :(得分:6)

调用堆栈可能与您期望的不同。您的方法可能会被内联,然后GetFrame(1)正在检索调用者的调用者。从字典中检索值时,它的类型不同,因为它用于不同的方法。

您可以尝试将属性[MethodImpl(MethodImplOptions.NoInlining]添加到SetAndGet,以防止该方法的内联优化。

答案 1 :(得分:5)

在运行调用

nuget pack时遇到了同样的问题
  

MSBuild自动检测:使用msbuild版本&#39; 15.0&#39; ...

但问题是通过运行调用

dotnet pack解决的
  

用于.NET Core的Microsoft(R)Build Engine版本15.3.409.57025