2010-11-03 5 views
4

J'ai besoin d'analyser le nom qualifié d'assembly sans utiliser AssemblyName, car j'obtiens System.IO.FileLoadException (les assemblys ne sont pas disponibles). Je gère uniquement les chaînes et non les assemblages. Si j'ai une chaîne, je veux obtenir des chaînes comme celles qui suivent pour les variables asm1 et asm2.Parse nom qualifié d'assembly sans utiliser AssemblyName

FullName = "CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico"

Assemblée = "CalidadCodigo.ParserSQL.AnalisisSintactico"

Version = "Version = 1.0.0.0"

Culture = " culture = neutral »

jeton public = "PublicKeyToken = 9744987c0853bf9e"

des suggestions, un exemple de code?

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    "; 

exception jeté: System.IO.FileLoadException: El de ensamblado Nombre de base o el código dado pas es válido. (Exception de HRESULT: 0x80131047).

System.Reflection.AssemblyName.nInit (Assemblée & ensemble, Boolean forIntrospection, booléenne raiseResolveEvent) System.Reflection.AssemblyName.nInit() System.Reflection.AssemblyName..ctor (String assemblyName)

Répondre

5

Pouvez-vous juste diviser par des virgules, couper les chaînes, puis vérifier le préfixe attendu de chaque partie?

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

Qu'en est-il des cas où le type nom est un type générique de type-paramètres? –

+0

@AlexanderMorou: Oui, ce serait plus compliqué. Je suppose que le PO n'était pas dans cette situation. –

+0

La spécification de nom de type est un cas assez ambigu permettant des noms comme: "Version = 1.0.0.0, Version \ = 1.0.0.0, Version = 1.0.0.0, ..." <- ce qui peut être amusant à analyser. –

0

Si vous savez que l'ordre des informations est tha même pour chaque entrée, vous pouvez utiliser la fonction string.Split() puis attribuer à chaque variable la chaîne située à une certaine position.

Ex:

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

vous utilisez le tableau de données liek ceci:

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

réponse de Jon ne peut pas accueillir les types de tableaux, qui peut avoir une virgule dans le typename, comme dans " System.String [,], mscorlib, .... "- voir http://msdn.microsoft.com/en-us/library/yfsftwz6.aspx pour plus de détails.

Voilà mieux:

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)); 
Questions connexes