2010-11-03 77 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));