当从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];
答案 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