【问题标题】:Use BuildManager.GetType to look through assemblies in WPF使用 BuildManager.GetType 查看 WPF 中的程序集
【发布时间】:2010-10-15 09:13:29
【问题描述】:

我有一个 ASP .NET 应用程序的现有代码,该应用程序使用反射来加载数据提供者。我想在 WPF 应用程序中重新使用此代码,但如果应用程序不是 ASP .NET,则 BuildManager.GetType 似乎只查看顶级程序集。有谁知道如何绕过这个限制?

以下代码引发异常,指出在 System.Web 程序集中找不到 DotNetNuke.Data.MySqlDataProvider。包含 DotNetNuke.Data.MySqlDataProvider 类的程序集肯定存在于编译的 WPF 应用程序的 bin 文件夹中。

Dim objType Type = BuildManager.GetType("DotNetNuke.Data.MySqlDataProvider", True, True)

【问题讨论】:

    标签: .net wpf reflection gettype


    【解决方案1】:

    AppDomain.CurrentDomain.GetAssemblies() 解决方案仅在您对已调用/输入的解决方案感兴趣时才有效。 在这个答案中,伊戈尔解释了它并介绍了一些解决方法。 How to find a type that is not loaded yet in AppDomain?

    【讨论】:

      【解决方案2】:

      尝试使用 AppDomain 查找类型,如下所示:

          private Type GlobalGetType(string typeName) 
          {
              Type t = null;
      
              foreach (Assembly ass in AppDomain.CurrentDomain.GetAssemblies()) 
              {
                  Type assType = ass.GetType(typeName);
      
                  if (t != null && assType != null)
                      throw new ArgumentException("The specified type was found on different assemblies (\"" + t.Assembly.FullName + "\" and  \"" + ass.FullName + "\")");
      
                  if (assType != null)
                      t = assType;
              }
      
              return t;
          }
      

      它将查看应用程序的每个程序集(包括框架程序集)。我不知道是否有办法知道程序集是否是顶级程序集,女巫会优化搜索,但它仍然很快。

      【讨论】:

      • 这正是我当时正在寻找的 :) 虽然我最终以不同的方式做到了,但我仍然会给你答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2016-09-21
      相关资源
      最近更新 更多