StreamReader не может прочитать FileStream кода из указанной сборки - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно проанализировать свойства и методы внутри классов в пользовательской среде, на которую ссылается мое активное решение с пакетом nuget.Я могу успешно прочитать файлы в своем активном решении, поскольку могу использовать локальный путь к файлу.Я также могу извлечь FileStream файла из сборки сборки, на которую указывает ссылка, но StreamReader только читает «MZ�», и, поскольку файлы находятся в пакете Nuget, у меня нет локального пути.

ЗдесьВот три решения, которые я пробовал, и проблемы, с которыми я сталкиваюсь в комментариях:

//attempt at using FileStream
                PortableExecutableReference location =
                    MetadataReference.CreateFromFile(Assembly.Load(assemblyName).Location);
                var assembly = Assembly.LoadFrom(location.FilePath);
                FileStream f = assembly.GetFiles()
                    .Where(t => type.Name == name).FirstOrDefault();
                if (f != null)
                {
                    using (StreamReader sr = new StreamReader(f))
                    {
                        while (!sr.EndOfStream)
                        {
                            fileString = sr.ReadLine();
                        }
                    }
                }
                //StreamReader does not read the FileStream, fileString value = "MZ�"

//attempt at geting the path thru f.Name
                PortableExecutableReference location =
                    MetadataReference.CreateFromFile(Assembly.Load(assemblyName).Location);
                var assembly = Assembly.LoadFrom(location.FilePath);
                FileStream f = assembly.GetFiles()
                    .Where(t => type.Name == name).FirstOrDefault();
                return f.Name;
                //only returns the framework path. StreamReader can't read the file with this and since its metadata I can't find the file in framework solution.

//attempt to at least get the base class information
                Assembly a = Assembly.GetAssembly(typeof(type));
                using (FileStream fs = a.GetFile(name))
                {
                    using (StreamReader sr = new StreamReader(fs))
                    {
                        return fileString = sr.ReadLine();
                    }
                }
                //fs = null

fileString должен содержать мой файл класса в виде строки.

1 Ответ

0 голосов
/ 05 февраля 2019

Исходный код не включен при сборке программы .NET;он компилируется в IL (в плотной двоичной форме, а не в текстовом источнике IL), и IL отправляется.Тот факт, что вы можете сделать это локально , является чистой случайностью наличия исходных файлов на вашем компьютере.В целом это не будет применяться.

В принципе вам понадобится другой вариант..NET имеет API полного отражения, что позволяет вам проверять огромное количество метаданных во время выполнения (включая поля, методы, свойства, атрибуты и т. Д.), Но не включает фактического исходного кода, потому что:Вы (обычно) не отправляете это.

Если вы можете более точно определить, что вам нужно сделать с тем, что в настоящее время fileString, мы, вероятно, поможем вам лучшеподходы, и что / не возможно и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...