97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
|
||||||||||||||||
1 | ||||||||||||||||
Реализовать Stream.CopyTo() для .NET 3.504.03.2016, 18:35. Показов 3339. Ответов 13
Метки нет (Все метки)
В связи с тем, что приходится вести проект на платформе .NET Framework 3.5 возникает необходимость в новых методах, реализующие расширение функциональности системных классов.
Причём подсматривать эту реализацию можно через .NET Reflector в уже реализованных методах на платформе .NET Framework 4.0. Вот и сейчас при подключении к своей программе специализированной библиотеки для парсинга особым образом кодированной структуры AndroidXml возникает ошибка: Error CS0103 The name 'CopyTo' does not exist in the current context AndroidXml Эта ошибка возникает из-за того, что в используемой в моём проекте версии платформы .NET Framrwork 3.5 нет ещё реализации серии методов CopyTo(), которые добавлены в версии .NET Framrwork 4.0. Эту проблему я думаю решить при помощи самостоятельной реализации этого метода, подсмотрев его реализацию через .NET Reflector в соответствующей библиотеке платформы .NET Framrwork 4.0. Там он находится в классе Stream пространства имён System.IO из файла mscorlib.dll. Для реализации этой задачи я создала класс ExtentionMethods, в который я поместила реализацию 2-х методов: 1. Реализацию необходимого мне метода CopyTo()
В исходном классе Stream - это было ясно и понятно, но как мне вызывать экземпляр этого класса в моём случае? Помогите, пожалуйста, мне понять каким образом, нужно изменить программный код (см. выше), чтобы я могла расширить класс Stream методом CopyTo() для платформы .NET Framework 3.5, используя приведенный выше код из версии платформы .NET Framework 4.0. Заранее благодарю за помощь.
1
|
04.03.2016, 18:35 | |
Ответы с готовыми решениями:
13
Реализовать классы Student, Group, Stream, Faculty Удалить из Stream-а все вещественные числа, не используя дополнительных Stream-ов stream.read(v,stream.size); //здесь ошибка при исполнении Ошибка при сохранении xmlDocument в Stream и получение из Stream буфер |
Администратор
|
||||||
04.03.2016, 19:00 | 2 | |||||
Сообщение было отмечено InessaSuper как решение
Решение
Для этого надо для начала прочитать документацию по реализации extension методов чтобы узнать, что a) методы объявляются в static классе и сами являются static; б) вместо this используется первый аргумент по которому компилятор понимает какой тип мы расширяем. Исходя из этого код можно переписать так:
Кликните здесь для просмотра всего текста
Я закоментировал обращения к Environment.GetResourceString т.к. это не public метод. Вместо надо можно вставить текст или переписать под свои ресурсы.
3
|
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
|
|
04.03.2016, 20:26 [ТС] | 3 |
При попытке компиляции этого кода у меня в программе возникает предупреждение:
You are debugging a release build. Using Just My Code with Release builds using compiler optimizations results in degraded debugging experience. - Stop debugging? - Disable Just My Code and continue? - Continue Debugging? - Continue Debugging (don't ask again)? Я собираю проект в Release-версии. Причём тут Continue Debugging? Я погуглила по поводу этой фичи "Just My Code" и нашла соответствующее описание: Just My Code How to: Step Into Just My Code) Understanding Just My Code Английским языком я владею в достаточной мере, чтобы понять прочитанное. Но мне непонятно, что мне отвечать на возникшее предупреждение, показанное на скриншоте (см. ссылку выше)? И самое главное, чем должен быть обусловлен этот выбор? Не по теме: P.S. Скажите, как на этот форуме можно прикреплять скриншоты к сообщениям?
0
|
Администратор
|
|
04.03.2016, 20:34 | 4 |
Не по теме: Нажми иконку со скрепкой, загрузи файл через появившееся окно, закрой его. Затем с помошью выпадающего меню у скрепки вставь ссылку на аттачмент в нужное место сообщения или не вставляй и тогда аттачмент будет показан в конце сообщения. Добавлено через 1 минуту Похоже ты вносила изменения в код забыв остановить отладку.
1
|
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
|
|
04.03.2016, 20:35 | 5 |
Что-то тут не сходится. Предупреждение возникает при компиляции или все же при попытке отладки скомпилированного в релизе бинарника?
0
|
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
|
|||||||||||
04.03.2016, 20:51 [ТС] | 6 | ||||||||||
Я выбрала опцию (см. ниже) в диалоговом окне с предупреждением и больше у меня это сообщение не выводилось.
- Disable Just My Code and continue? Странность как раз и заключалась в том, что отладку с точками останова на этом проекте я никакую не проводила, а сам проект находится в Release-режиме. Сейчас я столкнулась с другой трудностью при попытке подключения этого класса ExtentionMethods с расширяющими методами к своему основному проекту. В CS-файле, где осуществляется вызов созданного на предыдущем этапе расширяющего класс Stream метода CopyTo(), я подключила пространство имён с этим классом через
0
|
Администратор
|
|
04.03.2016, 21:13 | 7 |
Зря. Открой настройки отладчика (Tools -> Options -> Debugger -> Enable just My code) и включи опцию обратно.
Точки останова и конфигурация компиляции здесь ни при чем. Как я уже сказал скорее всего был запущен отладчик через F10 или F11 для которых точки останова не нужны. Расширяющий метод нужно вызывать на экземпляре того типа который он расширяет. В данном случае таким типом является Stream. Ты вызываешь CopyTo() как метод своего класса. Это бы прошло успешно только если бы текущий класс являлся наследником Stream. Как исправить ошибку по приведенному коду понять нельзя т.к. внутри ReadFully есть только один поток.
1
|
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
|
|
04.03.2016, 21:46 [ТС] | 8 |
Я работаю с кодами библиотеки "Android XML parser for .NET", которую я интегрирую в свою программу.
Библиотека "Android XML parser for .NET" использует для работы платформу .NET Framework 4.0, а код моей программы для совместимости с другими используемыми библиотеками должен использовать .NET Framework 3.5. Коды библиотеки находятся в свободном доступе и выложены в соответствующем разделе на CodePlex: Android XML parser for .NET В файле BoundedStream.cs в самом последнем методе и вызывается используемый мной расширяющий метод CopyTo(). Сейчас по контексту кода библиотеки "Android XML parser for .NET" можно понять каким образом нужно правильно вызвать метод CopyTo()?
0
|
6452 / 4053 / 1599
Регистрация: 09.05.2015
Сообщений: 9,487
|
|
04.03.2016, 22:06 | 9 |
По идее должно компилироваться без ошибок, т.к. BoundedStream наследник Stream. Может класс с методами расширения сделать public?
0
|
Администратор
|
|
04.03.2016, 22:07 | 10 |
InessaSuper, класс BoundedStream является наследником Stream и следовательно вызов CopyTo в приведенном выше коде должен работать. Раз он не работает, то или компилятор не видит расширяющий метод или в проекте есть другой класс Stream и путаница возникает из-за него.
0
|
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
|
||||||||||||||||||||||||||
05.03.2016, 02:07 [ТС] | 11 | |||||||||||||||||||||||||
Для того, чтобы успешно скомпилировать библиотеку "Android XML parser for .NET" оказалось, что перед вызовом метода CopyTo() необходимо было поставить this.
Ошибка: TypeLoadException: A type load exception has occurred. Моё приложение представляет собой проект в Unity3D, к которому я подключаю эту библиотеку, чтобы осуществить программный парсинг xml-файла, который хранится в apk-файле в закодированном виде. Мне необходимо осуществлять парсинг этого xml-файла программным образом во время выполнения моего Unity3D-приложения при помощи вызова методов из скомпилированной на предыдущем этапе библиотеки AndroidXml.dll. Но при перетаскивании скомпилированной библиотеки AndroidXml.dll в мой Unity3D-проект в консоли вывода сообщений компилятора появляется сообщение с ошибкой: Ошибка: TypeLoadException: A type load exception has occurred. Скажите, пожалуйста, что может быть с моей скомпилированной библиотекой AndroidXml.dll, что возникает подобного рода ошибка? Изначально я пыталась подключить оригинальную версию библиотекой AndroidXml.dll, которая была собрана для версии .NET Framework 4.0. В этом случае в Unity-консоли возникала следующая ошибка при подключении этой библиотеки.
Including a DLL in unity? Сейчас я собрала библиотеку AndroidXml.dll для платформы .NET Framework 3.5 и возникает ошибка: AndroidXml.dll.zip Ошибка: TypeLoadException: A type load exception has occurred. Вот ссылка на файл с собранной мной библиотекой под платформу .NET Framework 3.5: Скажите, пожалуйста, что может быть с моей скомпилированной библиотекой AndroidXml.dll, что возникает подобного рода ошибка при попытке её "разбора" C#-компилятором в Unity? Добавлено через 3 часа 10 минут После того, как я сделала класс с методами расширения public, как советовал Someone007, у меня всё заработало. Теперь у меня получившаяся библиотека AndroidXml.dll нормально загружается в Unity, и классы из этой библиотеки стали доступны внутри моего скрипта Operation.cs в Unity. Я только не могу понять как в моём случае подавать на входе в конструктор класса AndroidXmlReader параметр stream? В исходной документации приведены 2 строчки с примеров загрузки декодированного с помощью класса AndroidXmlReader документа XDocument для дальнейшей его обработки стандартными средствами парсинга XML-содержимого:
В своём скрипте Operation.cs в Unity я использую следующий код для чтения содержимого файла AndroidManifest.xml:
Теперь я предполагаю читать содержимое бинарного файла следующим образом:
Скажите, пожалуйста, как мне сформировать этот поток stream из имеющегося у меня байтового массива, в котором закодирован XML-формат в apk-файле под Android?
1
|
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
|
|
05.03.2016, 10:00 | 12 |
2
|
97 / 4 / 0
Регистрация: 09.05.2015
Сообщений: 70
|
||||||
05.03.2016, 13:30 [ТС] | 13 | |||||
Мне удалось запустить, наконец, тестовый вариант проекта в Visual Studio с использованием последнего совета.
Подключенная DLL-библиотека AndroidXml.dll отлично проводить дешифровку зашифрованного файла AndroidManifest_encoded.xml, который я извлекла из apk-сборки. Потом я подключила эту DLL-библиотеку к своему проекту в Unity. Когда я запускаю Unity-проект на выполнение в самом редакторе Unity, то чтение и парсинг XML-данных из зашифрованного файла AndroidManifest_encoded.xml происходит корректно. Но вот когда я запускаю этот же Unity-проект на мобильном устройстве, то при попытке чтения и парсинга XML-данных мне выдаётся следующая ошибка: System.TypeLoadException: Could not load type `System.IO.InvalidDataException` from assembly `AndroidXML` at AndroidXML.Res.ResXMLParser+<ParserIterator>d__60.MoveNext () [0x0000] in <filename unknown> Для уверенности я проверила, что из файла AndroidManifest_encoded.xml вычитывается корректная байтовая последовательность, которая идентична той байтовой последовательности, которая при запуске на десктопе дешифруется и парсится без всяких проблем. Таким образом, получается, что один и тот же алгоритм DLL-библиотеки AndroidXml.dll ведёт себя по разному на десктопной и мобильной версиях приложения. Вот ссылка на файл ResXMLParser.cs в котором возникает ошибка-исключение, выложенный на ресурсе CodePlex. Тут можно посмотреть содержимое соответствующего ему программного кода. http://androidxmldotnet.codepl... LParser.cs Скажите, что может вызывать возникновение этого исключения при запуске приложения на мобильной платформе? Я не могу понять почему в возникающей ошибке идёт речь о каком-то <filename unknown>, когда я использую на входе в парсер-дешифратор AndroidXML предварительно вычитанный байтовый массив byte[] fileContentBytes?
Добавлено через 51 минуту Вот ссылка на последнюю используемую версию DLL-библиотеки AndroidXML.dll: AndroidXml.dll.zip Для того, чтобы было более понятно о каком идентификаторе d__60 идёт речь в коде ошибки возникающим исключением я взяла файл AndroidXML.dll и декодировала его с помощью .NET Reflector. Вот листинг с декодированным кодом файла ResXMLParser.cs, в котором возникает ошибка: System.TypeLoadException: Could not load type `System.IO.InvalidDataException` from assembly `AndroidXML` at AndroidXML.Res.ResXMLParser+<ParserIterator>d__60.MoveNext () [0x0000] in <filename unknown> Я понимаю, что исключение InvalidDataException возникает, когда поток данных имеет недопустимый формат. Но как понять о каком потоке данных идёт речь в данном случае? Как я уже говорила, байтовые массивы с используемыми в приложении для дешифровки и парсинга данные идентичны для мобильной и десктопной платформ. Почему этот поток имеет правильный формат на десктопной платформе и ошибочный формат на мобильной платформе?
1
|
0 / 0 / 0
Регистрация: 06.03.2016
Сообщений: 1
|
|
06.03.2016, 14:15 | 14 |
Нужно получить как-то более детальную отладочную информацию.
Может быть кто-то на форуме подскажет как это можно сделать...
0
|
06.03.2016, 14:15 | |
06.03.2016, 14:15 | |
Помогаю со студенческими работами здесь
14
Как создать картинки используя bitmap.Save(Stream stream, .) Не получается скопировать из одного Stream в другой Stream CopyTo Почему в CopyTo такая формула? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |