“Specified cast is not valid” only on release build from MS build

纵饮孤独 提交于 2019-12-14 01:28:51

问题


I am getting a "Specified cast is not valid" valid when doing only a release build from MSBuild 4.0. I tested this out in using a release build from Visual Studio 2012 and didn't get this issue. I also tested this out using a debug build from MSBuild 4.0 and didn't get this issue.

Exception:

Code

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

The error is being thrown on this line

return (TResult)_getAndSetCache[methodBase];

回答1:


It is likely that the call stack is different than what you are expecting it to be. Your method may be getting inlined, then GetFrame(1) is retrieving the caller's caller. When the value is retrieved from the dictionary, it is of a different type because it is for a different method.

You could try adding the attribute [MethodImpl(MethodImplOptions.NoInlining] to SetAndGet to prevent the inlining optimization for the method.




回答2:


I had the same problem when running nuget pack which invoked

MSBuild auto-detection: using msbuild version '15.0'...

but the problem was solved by running dotnet pack which invoked

Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core



来源:https://stackoverflow.com/questions/14241389/specified-cast-is-not-valid-only-on-release-build-from-ms-build

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!