代码之家  ›  专栏  ›  技术社区  ›  Mikayla Hutchinson

无法将透明代理强制转换为来自AppDomain的类型

  •  11
  • Mikayla Hutchinson  · 技术社区  · 14 年前

    我正在尝试在appdomain中创建对象:

    var type = typeof (CompiledTemplate);
    var obj = (CompiledTemplate) domain.CreateInstanceAndUnwrap (
        type.Assembly.FullName, type.FullName);
    

    无法将透明代理强制转换为类型'Mono.TextTemplating.CompiledTemplate模板'.

    我运行的是.NET4.0,而不是Mono,尽管名称空间可能会建议:)

    我尝试向AppDomain添加AssemblyResolve处理程序,它使用程序集.LoadFrom以显式加载文件名,但代码基的扩展名仍为大写。因为原始程序集也加载了程序集.LoadFrom(通过单核细胞增多症),代码基值之间的差异似乎非常奇怪。

    对解决这个问题有什么建议吗?

    4 回复  |  直到 14 年前
        1
  •  5
  •   Prasad G    11 年前

    您可能遇到程序集加载上下文的问题吗? (例如,参见 here ) 您有一个类型,它明显位于加载上下文中(因为您正在使用 typeof(CompiledTemplate) ),但你是说辅助广告中的类型是从上下文加载到加载中的。。。

    你跟我查过了吗 fuslogvw 确定要加载哪些程序集?fuslog跟踪还将告诉您程序集是否正在加载到不同的上下文中。

        2
  •  1
  •   Aidanapword    13 年前

    实际上,程序集的第二个副本正在按原样加载到内存中。

    实例 因此,即使在第二次加载相同的DLL文件时,类型也不会被认为是匹配的。

    当“DLLHell”扩展到“GACAndDLLHell”时,这是一个典型的问题“天堂”是个更好的地方。。。:).

    如果您不能对代码库进行更改,首先,我会确保DLL只存在于驱动器上的1个位置(如果是从GAC加载的,则在驱动器上的0个位置)。在app/bin文件夹中包含“CompiledTemplate”类型的DLL副本将是真正的罪魁祸首。。。?

    此新代码或现有代码现在是否由于某种原因而失败?

        3
  •  0
  •   Ray    13 年前

    dynamic 关键字而不是将其强制转换为特定类型:

    var type = typeof (CompiledTemplate);
    dynamic obj = domain.CreateInstanceAndUnwrap (
        type.Assembly.FullName, type.FullName);
    

    这至少可以给你一个解决问题的方法。当然,潜在的缺点是没有编译时检查和/或性能较慢。然而,根据您的情况,这些可能是可以忽略不计的权衡。

        4
  •  0
  •   Ben    6 年前

    我有一个名为pipes的WCF网络应用程序,它使用回调(双工)体系结构。

    我得到这个错误是因为我的服务接口 [ServiceContract] 用错误的回调进行了注释。