gaurav.s23 Ответов: 2

Не мог понять несколько строк кодов, которые я получил после декомпиляции DLL


Я декомпилировал одну библиотеку dll и экспортировал ее в проект/решение.
Я пытался понять строки кодов, но не мог понять следующие строки.
Type type;
object objectValue = RuntimeHelpers.GetObjectValue(type.GetField("processInfo", BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.NonPublic).GetValue((object) Process.GetCurrentProcess()));
strFrom = StringType.FromObject(objectValue.GetType().GetField("processName", BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).GetValue(RuntimeHelpers.GetObjectValue(objectValue)));
Logger.write("process: " + strFrom);


я не понимал, что делают эти строки кодов.
Не могли бы вы объяснить.

Спасибо.

Что я уже пробовал:

Я попытался заглянуть в документацию и поискать в интернете

CHill60

Я удалил тег VB из вашего вопроса, так как это не VB

2 Ответов

Рейтинг:
2

Richard MacCutchan

Получение информации о Класс ProcessInfo (System. Web)[^].


Рейтинг:
2

Richard Deeming

Код, похоже, использует private отражение[^] чтобы прочитать значение, которое уже открыто через публичное свойство:
Процесс.Свойство ProcessName (System.Диагностика)[^]

Это примерно эквивалентно:

strFrom = Process.GetCurrentProcess().ProcessName;
Logger.write("process: " + strFrom);


[no name]

Я только что заметил, что приведенный выше код был в блоке catch, если
strFrom = процесс.GetCurrentProcess (). ProcessName;
Logger. write ("process:" + strFrom);
генерировать исключения.

[no name]

Выше кодовый блок, о котором идет речь, находится в блоке catch, который пытается получить имя процесса, если процесс.GetCurrentProcess (). ProcessName; по какой-то причине не удалось. Но приведенный выше код не строится, потому что тип не был инициализирован. Так есть ли какой-нибудь другой способ заставить его работать?

[no name]

код выглядит так :
строка strFrom = Logger.EmailExceptionFrom.Отделка();
if (strFrom.Длина = = 0)
{
пробовать
{
strFrom = процесс.GetCurrentProcess (). ProcessName;
}
catch (исключение ex1)
{
В статье projectdata.SetProjectError(ex1);
Logger. write("не удалось определить имя программы; попытка обходного пути...", 1);
пробовать
{
Тип тип;
object objectValue = RuntimeHelpers.GetObjectValue(тип.GetField ("processInfo", BindingFlags.Параметром Ignorecase | Флаг Bindingflags.Экземпляр / BindingFlags.непубличный).GetValue ((object) Process.GetCurrentProcess()));
strFrom = StringType.FromObject(objectValue.GetType (). GetField("processName", BindingFlags.Параметром Ignorecase | Флаг Bindingflags.Экземпляр / BindingFlags.Public | BindingFlags.непубличный).GetValue(RuntimeHelpers.GetObjectValue(objectValue)));
Logger. write ("process:" + strFrom, 1);
}
catch (исключение ex2)
{
В статье projectdata.SetProjectError(ex2);
Logger. write ("установка имени программы на 'WebService', так как обходной путь не удался: "+ ex2.StackTrace, 1);
В статье projectdata.ClearProjectError();
}
В статье projectdata.ClearProjectError();
}
}

Проблема в том, что я не могу перестроить этот код. Я получаю ошибку-использование неназначенной локальной переменной 'type'. Есть ли какая-нибудь работа вокруг?

Richard Deeming

Либо используйте код, который я опубликовал, либо инициализируйте type переменная.

Type type = typeof(Process);