代码之家  ›  专栏  ›  技术社区  ›  Kiquenet user385990

不使用assembly name分析程序集限定名

  •  4
  • Kiquenet user385990  · 技术社区  · 14 年前

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

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

    Assembly=“CalidadCodigo.ParserSQL.analisissionattico”

    Version=“版本=1.0.0.0”

    Culture=“文化=中性”

    有什么建议,示例代码吗?

    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:El nombre异常 de ensamblado el cdigo基地护墙板编号 埃斯维利多。(结果除外: 0x80131047)。

    汇编,布尔反省, 布尔raiseResolveEvent) System.Reflection.AssemblyName..ctor(字符串 程序集名称)

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jon Skeet    14 年前

    你能不能用逗号分开,修剪字符串,然后检查每个部分的预期前缀?

    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
    
        2
  •  5
  •   David Turner    13 年前

    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));
    
        3
  •  0
  •   Liviu Mandras    14 年前

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

    前任:

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

    然后使用数据数组确定:

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