不使用AssemblyName解析程序集限定名称

时间:2010-11-03 09:24:34

标签: c# parsing assemblies

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

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

  

FullName =“CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico”

     

Assembly =“CalidadCodigo.ParserSQL.AnalisisSintactico”

     

Version =“Version = 1.0.0.0”

     

文化=“文化=中立”

     

Public token =“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:El nombre   de ensamblado oelcódigobasedado no   esválido。 (ExcepcióndeHRESULT:   0x80131047)。

     

System.Reflection.AssemblyName.nInit(装配&安培;   assembly,Boolean forIntrospection,   Boolean raiseResolveEvent)   System.Reflection.AssemblyName.nInit()   System.Reflection.AssemblyName..ctor(字符串   的AssemblyName)

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:4)

Jon的答案不适用数组类型,它可能在typename中有逗号,如“System.String [,],mscorlib,....” - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx。 p>

这里更好:

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 :(得分:0)

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

例如:

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

然后你使用数据数据谎言:

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