2010-11-03 79 views
4

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

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

全名= “CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico”

大会= “CalidadCodigo.ParserSQL.AnalisisSintactico”

版本= “版本= 1.0.0.0”

文化=“文化=中性”

公共令牌= “公钥= 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:萨尔瓦多农布雷 德ensambladoØELcódigo基地墙裙没有 ES VALIDO。 (Excepciónde HRESULT: 0x80131047)。

System.Reflection.AssemblyName.nInit(大会& 组件,布尔forIntrospection, 布尔raiseResolveEvent) System.Reflection.AssemblyName.nInit() System.Reflection.AssemblyName..ctor(字符串 的AssemblyName)

回答

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 
+0

那如果类型名称为泛型类型与类型参数的情况下? – 2016-06-13 12:45:50

+0

@AlexanderMorou:是的,那会更棘手。我认为OP不是这种情况。 – 2016-06-13 12:46:23

+0

类型名称规范是一个非常模糊的例子,允许名称如:“版本= 1.0.0.0,版本\ = 1.0.0.0,版本= 1.0.0.0,...”< - 这可以很有趣的解析。 – 2016-06-13 12:47:06

0

如果您知道的信息的顺序是一样THA每个输入可以使用string.Split()功能,然后分配给每个变量位于某一位置的字符串。

例:

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

然后使用数据阵列liek这样的:

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

乔恩的答案并不适应数组类型,其可能在类型名逗号,如“ 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));