MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Проверить если ли в коде классы, строки, массивы"
Answer 810388
Как вариант, скомпилировать код, загрузить полученную сборку и через Reflection проверить типы полей и локальных переменных. Если считать, что код использует массивы, когда в нем есть хотя бы одно поле или локальная переменная с типом, унаследованным от Array, как-то так:
using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Text; using System.Reflection; using System.CodeDom.Compiler; using Microsoft.CSharp; namespace ConsoleApplication1 { class Program { //отображает информацию о использовании строк и массивов в сборке public static string GetAssInfo(Assembly ass) { StringBuilder sb = new StringBuilder(500); Type type; List<string> arrays = new List<string>(); List<string> strings = new List<string>(); //анализируем типы сборки foreach (TypeInfo t in ass.DefinedTypes) { foreach (var mem in t.DeclaredMembers) { switch (mem.MemberType) { case MemberTypes.Field: type = (mem as FieldInfo).FieldType; if (type.BaseType == typeof(Array)) { arrays.Add(t.ToString() + ", поле " + type.ToString() + " " + mem.Name); } if (type == typeof(string)) { strings.Add(t.ToString() + ", поле " + type.ToString() + " " + mem.Name); } break; case MemberTypes.Method: MethodInfo mi = (mem as MethodInfo); var body = mi.GetMethodBody(); foreach (var local in body.LocalVariables) { if (local.LocalType.BaseType == typeof(Array)) { arrays.Add(t.ToString() + ", метод " + mi.Name + ", переменная " + local.ToString()); } if (local.LocalType == typeof(string)) { strings.Add(t.ToString() + ", метод " + mi.Name + ", переменная " + local.ToString()); } } break; } } } //выводим информацию sb.AppendLine("Найдено использований массивов: " + arrays.Count.ToString()); foreach (var s in arrays) { sb.AppendLine("- " + s); } sb.AppendLine(); sb.AppendLine("Найдено использований строк: " + strings.Count.ToString()); foreach (var s in strings) { sb.AppendLine("- " + s); } return sb.ToString(); } public static void Main(string[] argv) { //путь к файлу с исходным кодом должен быть передан первым аргументом if(argv.Length==0){Console.WriteLine("Укажите файл с исходым кодом");return;} var csc = new CSharpCodeProvider(); string source = File.ReadAllText(argv[0]); var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }, "foo.dll", true); //компилируем сборку из кода CompilerResults results = csc.CompileAssemblyFromSource(parameters,source); if (results.Errors.Count > 0) { Console.WriteLine("Не удалось скомпилировать код"); foreach (var err in results.Errors) { Console.WriteLine(err.ToString()); } return; } //выводим информацию string s = GetAssInfo(results.CompiledAssembly); Console.WriteLine("* Информация о сборке: *"); Console.WriteLine(); Console.WriteLine(s); } } }
Недостаток способа в том, что при этом сборка грузится в память процесса и от нее никак нельзя избавиться до завершения работы программы (кроме выгрузки всего домена приложений). Также, он является небезопасным, так как позволяет выполнить вредоносный код, если он будет во входном файле.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.