【问题标题】:Parse assembly qualified name without using AssemblyName不使用 AssemblyName 解析程序集限定名称
【发布时间】:2010-11-03 09:24:33
【问题描述】:

我需要在不使用 AssemblyName 的情况下解析程序集限定名称,因为我得到 System.IO.FileLoadException(程序集不可用)。

我只管理字符串而不是程序集。如果我有一个字符串,我想为 asm1 和 asm2 字符串变量获取如下字符串。

FullName = "CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico"

Assembly ="CalidadCodigo.ParserSQL.AnalisisSintactico"

版本=“版本=1.0.0.0”

文化=“文化=中立”

公共令牌 = "PublicKeyToken=9744987c0853bf9e"

任何建议,示例代码?

var asm1 = "CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico,CalidadCodigo.ParserSQL.AnalisisSintactico, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9744987c0853bf9e";


var asm2 = "CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico,                CalidadCodigo.ParserSQL.AnalisisSintactico          , Version=1.0.0.0     , Culture=neutral,    PublicKeyToken=9744987c0853bf9e              ";

抛出异常: System.IO.FileLoadException: 别名 de ensamblado o el código base dado no 有效。 (HRESULT 例外: 0x80131047)。

System.Reflection.AssemblyName.nInit(Assembly& 装配,布尔用于自省, 布尔 raiseResolveEvent) System.Reflection.AssemblyName.nInit() System.Reflection.AssemblyName..ctor(字符串 组件名称)

【问题讨论】:

    标签: c# parsing assemblies


    【解决方案1】:

    Jon 的回答不包含数组类型,它们的类型名中可能有逗号,如“System.String[,],mscorlib,....” - 详情请参阅 http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx

    这里更好:

    int index = -1;
    int bcount = 0;
    for (int i = 0; i < aqtn.Length; ++ i)
    {
        if (aqtn[i] == '[')
            ++bcount;
        else if (aqtn[i] == ']')
            --bcount;
        else if (bcount == 0 && aqtn[i] == ',')
        {
            index = i;
            break;
        }
    }
    string typeName = aqtn.Substring(0, index);
    var assemblyName = new System.Reflection.AssemblyName(aqtn.Substring(index + 1));
    

    【讨论】:

      【解决方案2】:

      你可以用逗号分隔,修剪字符串,然后检查每个部分的预期前缀吗?

      List<string> parts = name.Split(',')
                               .Select(x => x.Trim())
                               .ToList();
      
      string name = parts[0];
      string assembly = parts.Count < 2 ? null : parts[1];
      string version = parts.Count < 3 ? null : parts[2];
      string culture = parts.Count < 4 ? null : parts[3];
      string token = parts.Count < 5 ? null : parts[4];
      
      if (version != null && !version.StartsWith("Version="))
      {
          throw new ArgumentException("Invalid version: " + version);
      }
      // etc
      

      【讨论】:

      • 如果类型名是带有类型参数的泛型类型怎么办?
      • @AlexanderMorou:是的,那会更棘手。我认为 OP 不在那种情况下。
      • 类型名称规范是一个非常模糊的情况,允许使用如下名称:“Version=1.0.0.0, Version\=1.0.0.0, Version=1.0.0.0,...”
      【解决方案3】:

      如果您知道每个输入的信息顺序相同,您可以使用string.Split() 函数,然后将位于某个位置的字符串分配给每个变量。

      例如:

      string s = "a,as,sd,ad";
      string[] data = s.Split(new char[] { ',' });
      

      然后你使用数据数组就像这样:

      fullname = data[0].Trim();
      ...
      

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多