【问题标题】:Can't cast object to its own type无法将对象转换为自己的类型
【发布时间】:2021-06-02 14:41:09
【问题描述】:

在 Blazor 页面中,当我将模型“投射”到它的实际给定类型时,我遇到了这个奇怪的错误。错误是这样的:

Unable to set property 'Model' on object of type 'CSBApp.ExtHdr'. 
The error was: [A]TQ.ModelExt cannot be cast to [B]TQ.ModelExt. 
Type A originates from 'TQ.Exts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' 
at location 'C:\_work\Server.SSB\bin\Debug\net5.0-windows\TQ.Exts.dll'. 
Type B originates from 'TQ.Exts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' 
at location 'C:\_work\Server.SSB\bin\Debug\net5.0-windows\TQ.Exts.dll'.

好像加载了两个相同的程序集!

object Model = ...; // actually a ModelExt
var a1 = Model.GetType().Assembly;
var a2 = typeof(ModelExt).Assembly;
if (a1 != a2) {
    DBG.Log("merde...");
}

程序集 a1 和 a2 具有相同的名称、版本和位置,但 m_assembly 不同。

这怎么可能??

【问题讨论】:

  • 从 AppDomain.AssemblyLoad 事件中记录堆栈跟踪?
  • 从一开始就发生(只要 ASP.Net 可用) - 因为重新构建不会重新启动站点,而只是加载具有相同名称的另一个程序集与请求相关的所有对象- 缓存/存储在内存状态中的类型不匹配,看起来完全一样...
  • @Alexei 我使用的不是 IIS,而是一个 asp.net 核心独立服务器。服务器每次都会重新启动。
  • @Lakeman 是的,它被加载了两次......一次来自 Assembly.LoadFile,后来来自无法识别的本机代码

标签: c# asp.net-core razor blazor razor-pages


【解决方案1】:

回答我自己的问题。请参阅此处 (https://docs.microsoft.com/en-us/dotnet/framework/deployment/best-practices-for-assembly-loading) 关于在多个上下文中加载。

简而言之,使用Assembly.LoadFrom() 而不是Assembly.LoadFile()

感谢 Jeremy Lakeman 提出的 AppDomain.AssemblyLoad 事件创意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2021-12-06
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多