调试在.NET中调用AppDomain.CreateInstanceAndUnwrap时抛出的AmbiguousMatchException

时间:2009-01-07 06:54:06

标签: c# .net

当我调用AppDomain.CreateInstanceAndUnwrap来实例化另一个AppDomain中的类型时,我有一个抛出AmbiguousMatchException的应用程序。这发生在我无法直接访问的客户计算机上。我认为问题是加载了相同程序集的两个副本。有没有办法弄清楚是否是这种情况以及从哪里加载两个组件?启用融合日志会提供任何其他信息吗?

1 个答案:

答案 0 :(得分:0)

融合日志可能有所帮助,但另一种选择可能是挂钩AssemblyLoad事件:

    AppDomain.CurrentDomain.AssemblyLoad += (s, a) =>
    {
        Console.WriteLine(a.LoadedAssembly.FullName);
        Console.WriteLine(a.LoadedAssembly.CodeBase);
    };

此错误有两个主要原因:

  • 巧合命名 - 即Foo.dll和Bar.dll都有Some.Namespace.Type类型
  • 不同组件引用的不同版本(主要是GAC) - 即您的DAL加载某些dll的v2,并且您的UI /实用程序代码加载了相同dll的v4

当然,另一个选择是你的AppDomain已经相互感染了(通过在API上公开引用,很容易在AppDomain边界上意外地吸引引用MarshalByRef对象)。