【问题标题】:Parsing assembly qualified name?解析程序集限定名称?
【发布时间】:2010-11-27 11:23:19
【问题描述】:

我想在 .NET 3.5 中解析程序集限定名称。特别是,程序集本身不可用,它只是名称。我可以想到很多方法手动,但我想我可能会在系统库中缺少一些功能来做到这一点。有什么建议吗?

【问题讨论】:

  • 这里指的是 .NET 程序集。

标签: .net parsing reflection assemblies


【解决方案1】:

AssemblyName 类可以为您解析程序集名称,只需将字符串传递给其构造函数即可。如果你有一个程序集限定的类型名称,我认为你必须先去掉字符串的类型部分(即第一个逗号之前的所有内容)。

【讨论】:

  • 剥离名称通常非常复杂。甚至考虑简单的 Tuple:“System.Tuple`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0. 0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  • AssemblyName 构造函数抛出 FileLoadException,除非它能够加载程序集
【解决方案2】:

MonoBNF grammar on MSDN中有一个解析器实现

【讨论】:

    【解决方案3】:

    从 .Net 4 开始,您有一个新的 Type.GetType 覆盖:

    public static Type GetType(
        string typeName,
        Func<AssemblyName, Assembly> assemblyResolver,
        Func<Assembly, string, bool, Type> typeResolver,
        bool throwOnError,
        bool ignoreCase
    )
    

    http://msdn.microsoft.com/en-us/library/ee332784%28v=vs.100%29.aspx

    你需要做的是在上述文档的例子中:

    Type t2 = Type.GetType(test,
                (aName) => aName.Name == "MyAssembly" ? 
                    Assembly.LoadFrom(@".\MyPath\v5.0\MyAssembly.dll") : 
                    Assembly.Load(aName),
                (assem, name, ignore) => assem == null ? 
                    Type.GetType(name, false, ignore) : 
                    assem.GetType(name, false, ignore), true
    );
    

    你可以用更复杂的函数替换上面的 lambdas。

    【讨论】:

      【解决方案4】:

      Alphaleonis.Reflection.Metadata 中有一个类 TypeIdentifier(也可从 NuGet 获得),它可以解析程序集限定名称(以及完整类型名称或简单类型名称),并对其进行解构并允许对其进行修改。

      【讨论】:

        【解决方案5】:

        如果加载了程序集,您可以使用类似的东西:

            Assembly assembly = Assembly.GetExecutingAssembly();
            string assemblyName = assembly.GetName().Name;
        

        在上面的示例中,我使用了一个正在执行的程序集,但您循环访问了已加载的程序集。

        更新: 您始终可以在单独的 AppDomain 中加载程序集,获取程序集名称,完成后将其卸载。 如果您需要样品,请告诉我。

        【讨论】:

        • 嗯,准确地说,我手头没有组装。我想解析代表它的名字的字符串。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        • 2011-05-14
        • 1970-01-01
        • 2010-10-01
        • 1970-01-01
        相关资源
        最近更新 更多