Разбор полного имени сборки без использования AssemblyName - PullRequest
4 голосов
/ 03 ноября 2010

Мне нужно разобрать полное имя сборки без использования AssemblyName, потому что я получаю System.IO.FileLoadException (сборки не доступны).

Я управляю только строками, а не сборками.Если у меня есть строка, я хочу получить строки, подобные приведенным ниже, для строковых переменных asm1 и asm2.

FullName = "CalidadCodigo.ParserSQL.Reglas.AnalisisSintactico"

Assembly = "CalidadCodigo.ParserSQL.AnalisisSintactico "

Version =" Version = 1.0.0.0 "

Culture =" Culture = нейтральный "

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: базовая база данных или базовая база данных.(Исключение из HRESULT: 0x80131047).

System.Reflection.AssemblyName.nInit (сборка и сборка, логическое значение forIntrospection, логическое повышениеResolveEvent) System.Reflection.AssemblyName.nInit () System.Reflection.ctorAssemblyName)

Ответы [ 3 ]

5 голосов
/ 03 ноября 2010

Вы можете просто разделить запятыми, обрезать строки, а затем проверить ожидаемый префикс каждой части?

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
4 голосов
/ 23 июня 2012

Ответ Джона не учитывает типы массивов, которые могут иметь запятую в имени типа, как в "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));
0 голосов
/ 03 ноября 2010

Если вы знаете, что порядок информации одинаков для каждого входа, вы можете использовать функцию string.Split(), а затем присваивать каждой переменной строку, расположенную в определенной позиции.

Ex:

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

тогда вы используете массив данных вот так:

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