"Указанный приказ недействителен" только при создании релиза из сборки MS

Я получаю "Указанный приведение недействителен", действительный при выполнении только сборки релиза из 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];

Ответ 1

Вероятно, что стек вызовов отличается от того, что вы ожидаете от него. Ваш метод может быть вставлен, затем GetFrame(1) извлекает вызывающего абонента. Когда значение извлекается из словаря, оно имеет другой тип, потому что это для другого метода.

Вы можете попробовать добавить атрибут [MethodImpl(MethodImplOptions.NoInlining] в SetAndGet, чтобы предотвратить оптимизацию inlining для этого метода.

Ответ 2

У меня была такая же проблема при запуске nuget pack, который вызывал

Автообнаружение MSBuild: с использованием версии msbuild '15.0 '...

но проблема была решена при запуске dotnet pack, который вызывал

Microsoft (R) Build Engine версия 15.3.409.57025 для .NET Core