Страницы

Поиск по вопросам

Показаны сообщения с ярлыком visual-studio-2012. Показать все сообщения
Показаны сообщения с ярлыком visual-studio-2012. Показать все сообщения

воскресенье, 15 марта 2020 г.

Отладка приложения - количество памяти

#c_sharp #visual_studio_2012


Как узнать сколько памяти потребляет приложение (на С#) при работе? Либо "участок
кода" - допустим есть метод который считывает данные, можно ли узнать сколько памяти
он потребляет во время работы.

ds.ReadXml(xml);


IDE - VS2012
    


Ответы

Ответ 1



Отслеживание изменений в оперативной памяти: С помощью кода: long before = GC.GetTotalMemory(false); // ваш код тут long after = GC.GetTotalMemory(false); int consumedInMegabytes = (after - before) / (1024 * 1024); Опционально может потребоваться собрать мусор до и/или после тестируемого кода (параметр GetTotalMemory поставить в true). С помощью профайлеров (суть аналогична): снять снэпшот до тестируемого кода, выполнить код, снять снэпшот после, сравнить два снэпшота. Профайлер поможет ответить не только на на вопрос "сколько?", но и "на что?".

четверг, 13 февраля 2020 г.

Автоматический перенос фигурной скобки в VS на новую строку

#visual_studio #cpp #visual_studio_2012


В Visual Studio принят такой стиль кода:
class MyClass
{
//pass
};

Как его поменять на:
class MyClass {
//pass
};
    


Ответы

Ответ 1



для C# это делается так: Сервис -> Параметры -> Текстовый редактор -> C# -> Форматирование -> Новые строки. И далее выбираете те или иные флаги, интересующие вас. Как это сделать для С++ я, к сожалению, не нашел. Возможно, есть возможность настройки и для плюсов. У меня это работало в VS 2012 Ultimate. В других версиях, вероятно, будет то же самое

Ответ 2



сервис-параметры-текстовый редактор-табуляция::отступы

суббота, 8 февраля 2020 г.

Как завтавить работать scanf() в VS2012

#visual_studio #cpp #visual_studio_2012


Здравствуйте!
MSVS 2012 не хочет работать с базовой сишной функцией scanf(), нужно писать scanf_s().
Проект консольный, пустой. Как заставить её работать?
PS #define _CRT_SECURE_NO_WARNINGS не помогло.
Спасибо.    


Ответы

Ответ 1



#define _CRT_SECURE_NO_WARNINGS тут не поможет. Вам нужно сделать вот что ( работает в Visual Studio 2012, думаю, сработает и в более ранних) Пункт меню View => Other Windows => Property Manager В появившемся окне кликаете правой кнопкой по проекту, выбираете пункт Properties Configuration Properties => C/C++ => Preprocessor => Preprocessor Definitions Кликаете Edit в выпадающем списке Добавляете в появившемся окошке строку _CRT_SECURE_NO_WARNINGS Сохраняете, закрываете. Должно работать Для наглядности: ** Как найти Property Manager** Вариант 2. На русской VS может не сработать В правом верхнем углу есть поле для поиска: Куда тыкать дальше И наконец

суббота, 28 декабря 2019 г.

Сборка приложения для windows с использованием visual studio

#cpp #visual_studio #cppbuilder #visual_studio_2012 #visual_cpp


Доброго времени суток!

Разрабатываю понемножку с использовванием visual studio(13), и постоянно мучит особенность
сборки под винду, которая заключается в следующем: для корректной работы на другом
компьютере необходимо ручками докладывать библиотеки, которые приложение просит на
выходе. В то же время, когда приложение собирается в релизе и запускается, то студия
автоматически подкадывает нужные библиотеки, что б приложение могло запуститься. 

Что необходимо сделать для того что бы студия скопировала все необходимые для работы
библиотеки в папку рядом с ехе-шником?
    


Ответы

Ответ 1



Стандартно, в студии ничего подобного не предусмотрено. Предпологается, что разработчик сам знает какие библиотеки используются в его проекте и сам ими управляет. Однако, есть библиотеки которые могут линковаться неявно, при этом способ линковки (статическая/динамическая) можно настраивать в параметрах проекта: CRT - настраивается параметром "C/C++\Code Generation\Runtime Library", по-умолчанию включена динамическая линковка и именно из-за нее у новичков возникают проблемы при распространении ПО; если включить статическую линковку то DLL тянуть не потребуется. MFC - настраивается "General\Use of MFC", по-умолчанию не используется ATL - настраивается "General\Use of ATL", по-умолчанию не используется Проблема в том, что на машине разработчика все эти библиотеки устанавливатся вместе со студией и поэтому ПО запускается из любого места. А вот на машине пользователя этих библиотек часто нет, от сюда у новичков и возникают проблемы. Проблема решается либо статической линковкой, либо установкой соответсвующих пакетов (редистов) нужных версий (ссылки успешно яндексятся на сайте Майкрософта) Вторая проблема в том, что при автоматической загрузке DLL, требуется чтобы все библиотеки в пределах одного бинаря линковались одинаково. Это означает, например, что если QT слинковам с CRT динамически то и наш бинарь должен линковать CRT динамически. Это можно обойти, если применять не автоматическую а ручную загрузку DLL, но тогда гемор разрастется многократно. Проще немного увеличить инсталянт в размере, може мне поверить.

Ответ 2



Для корректной работы на другом компьютере, при настройках сборки по умолчанию (то есть с ключом /MD), нужно установить Microsoft VC++ Redistributable (2013, в данном случае), корректной архитектуры (x86 или amd64, в зависимости от настроек сборки). Класть эти файлы (msvcxxx120.dll) в папку приложения абсолютно некорректно, ибо нарушается механизм их корректной регистрации в системе и обновления (На машинах с включенным Windows Update VC++ redistributables сами обновляются, в папке же приложения останутся старые версии, в том числе с неустраненными уязвимостями) Некорректно распространять Debug-версии этих файлов (при сборке в Debug-конфигурации, с ключом /MDd, используются версии библиотек с d на конце (msvcr120d.dll), соответственно перед распространением приложения нужно убедиться что включена Release-конфигурация. Для простого приложения, состоящего из одного exe-файла, зависимости от CRT-библиотек можно избежать, собрав с ключом /MT, что незначительно увеличит приложение в размере, однако при сложном приложении, состоящем из множества библиотек - в размере увеличится каждая библиотека, и выигрыш теряется. При использовании сторонних библиотек/фреймворков (Qt, boost, и т.д.) следует проследить, что их библиотеки собраны в точном соответствии с конфигурацией приложения - приложение, собранное с /MD при попытке использования Qt, собранного с /MT и наоборот (а так же если сторонняя библиотека собрана с другой версией CRT, например msvcr90.dll) практически гарантировано вызовет ошибки и вылеты

Ответ 3



Помогло указывание в свойствах проекта /MT (/MTd): Properties -> Configuration Properties -> C/C++ -> All Options -> Runtime Library -> Multi-threaded (/MT) (или Multi-threaded Debug (/MTd)) а также указывание платформы Windows XP: Properties -> Configuration Properties -> General -> Platform Toolset -> Visual Studio 2013 - Windows XP (v120_xp)

Доступ к private методам

#c_sharp #visual_studio_2012


Как получить доступ к private методу?
C#, VS 2012.
Спасибо.
P.S. Прежнее название темы - "Unit Test для private методов"    


Ответы

Ответ 1



@Track (В коммент точно не влезло бы :) Как речь может идти о Unit тестах, но при этом не идти о рефакторинге? Когда девелопится какой-то продукт, у разработчика всего два возможных варианта действий — либо писать нормальный production код, либо писать write-only код, который сразу после этого летит на помойку (Spike в терминологии Extreme Programming). В первом случае Unit тесты специфицируют поведение этого кода и неразрывно связаны с рефакторингом, поскольку позволяют уменьшить количество ошибок при его выполнении. Во втором случае Unit тесты не нужны по определению. Если рассуждать на тему вопроса, то тестирование private методов бессмысленно по нескольким причинам: Гипотетический зеленый Unit тест для приватного метода не дает никаких знаний о поведении соответствующего класса. Этот private метод может вообще не вызываться из public методов класса, а у вас добавится ненужный тест, который еще и надо поддерживать. Контракты private методов крайне изменчивы. Сегодня, скажем, метод называется SafelyCreateBlackBox(...), а завтра — ReconstructContainerFromScratch(...). Оно полностью противоречит концепции TDD, в которой дизайн продукта продиктован спецификацией его поведения в виде набора тестов. Вы же не станете начинать разработку с написания тестов на private методы несуществующих классов? :) То, что в какой-то момент времени вам захотелось написать тест на private метод, скорее всего, означает одно из двух: У вас нет тестов и есть некоторый класс с большим количеством ответственностей. Вы пытаетесь убедиться в корректности его поведения "по кусочкам", например, начав с тестирования private методов. Правильнее в этом случае нужно понять, какое поведение ожидается от класса, заспецифицировать это поведение в тестах, использующих public интерфейс класса и провести рефакторинг этого класса с целью уменьшения числа его ответственностей. У вас есть тесты и вам все еще кажется, что тестирование private метода — это хорошая идея. В таком случае, скорее всего, логика private метода неплохо укладывается в некоторую отдельную сущность и может быть вынесена из исходного класса. В этом случае нужно придумать название для новой сущности, специфицировать ее поведение в тестах и вынести ее из исходного класса.

Ответ 2



Начнём с того, что private-методы не предназначены для тестирования. Они не являются частью официального "фасада" класса, они имеют право рассчитывать на выполнение инвариантов и предварительных условий, но не проверять их явно, имеют право вести себя "неправильно", будучи вызванными в не рамках установленного для них workflow. Вы, однако, можете тестировать internal-методы. Они будут доступны тестирующей сборке, если вы укажете атрибут InternalsVisibleTo.

Ответ 3



Решение - использовать Reflection например так: var field = typeof(CopyItems).GetMethod(("FixRenamedPath"), BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static); string targetFile = (string)field.Invoke(null, new object[] { renamedFile, relatedFile, targetDir });

пятница, 13 декабря 2019 г.

Как подключить библиотеку, чтобы на другом ПК её было достаточно поместить в папку с exe файлом?

#c_sharp #net #visual_studio #dll #visual_studio_2012


Для работы программы необходим Microsoft.Office.Interop.Word.dll. На некоторых ПК
он может отсутствовать, поэтому решил, что следует поместить его в папку с программой.

Подключаю его через ссылки (reference) и на моём ПК всё работает. Однако, расположение
библиотеки указывается полностью и на другом ПК придётся поместить его в ту же папку.

Собственно, как подключать библиотеку, чтобы при выполнении она бралась из папки,
где находится exe файл?

Разбираться с тем, как организовать установку на пользовательском ПК нет времени
(да и нужды).
    


Ответы

Ответ 1



Указать в свойствах референса CopyLocal = True. Но обратите внимание на замечание @pavelip -- чтобы работала интеграция с Вордом, прежде всего на компьютере д.б. установлен Ворд.

Ответ 2



Сборка Microsoft.Office.Interop.Word.dll - это всего лишь обертка вокруг COM объектов MS Word. Для правильной работы на другом ПК должен быть установлен MS Word.

Ответ 3



Полный путь в reference - это информация для студии и компилятора. В самом exe библиотека будет подключена по имени - Microsoft.Office.Interop.Word. При запуске среда будет искать ее в стандартных местах, в том числе и в папке приложения. При выставленном на референсе CopyLocal = True (по умолчанию) студия скопирует dll в папку с exe, так что вам достаточно будет просто скопировать на пользовательский ПК всю папку целиком.

Ответ 4



dll по-умолчанию сначала ищется в папке с exe и только если её там нет в папке windows, а если и там нет то начинает поиск по папкам из глобальной переменной PATH

воскресенье, 8 декабря 2019 г.

Как сделать единую версию для всех проектов решения

#c_sharp #visual_studio_2012 #assembly


Есть решение, в нем несколько проектов.
Например, проекты: осн. прилож., сервис прилож., библиотека1, библиотека2.
У каждого проекта своя версия, свой файл assembly.cs.
Как сделать файл общим, или версию общую?

Видел вариант, когда у основного проекта файл, а у остальных файла физически нет,
но в дереве проектов есть и значок типа ярлыка.

Как это сделать?
    


Ответы

Ответ 1



Очень просто. Заведите в общем для всех проектов месте файл CommonAssemblyInfo.cs, в котором укажите общую для всех проектов информацию (например, версию). Для каждого из проектов, который должен это использовать, удалите эту самую информацию из AssemblyInfo.cs (этот файл обычно находится в каталоге Properties в стандартном проекте). Добавьте CommonAssemblyInfo.cs в проект через Solution explorer → проект → Add... → Existing Item → CommonAssemblyInfo.cs, не забудьте выбрать «Add as link» Переместите добавленную ссылку в каталог Properties внутри проекта. Для ваших целей в CommonAssemblyInfo.cs имеет смысл указать [assembly: AssemblyVersion("10.1.0.0")] [assembly: AssemblyFileVersion("10.1.0.0")] // File version в свойствах DLL [assembly: AssemblyInformationalVersion("10.1.0.0")] // Product version в свойствах DLL

Ответ 2



Создайте новый cs файл с [assembly: AssemblyVersion("1.2.3.4")] [assembly: AssemblyFileVersion("1.2.3.4")] и добавьте его во вcе проекты через "Add Existing Item" - "Add As Link".

четверг, 11 июля 2019 г.

Уведомление о завершении сборки проекта в Visual Studio(2012)

Часто когда сидишь над большими проектами, особенно ночью, на сборку уходит много времени, но еще больше тратится из-за того, что по завершении проекта по уммолчанию отсутствует звуковое уведомление, которое может тебя разбудить. Как такое уведомление можно настроить?


Ответ

Вам нужно:
Создать *.bat файл с командой @echo • Открыть свойства проекта в Visual Studio, затем Build Events > Post-Build Event > Command Line > Edit Ввести команду call <имя батника> (например call C:\beep.bat) Сохранить изменения и протестить.

среда, 5 июня 2019 г.

Отладка приложения - количество памяти

Как узнать сколько памяти потребляет приложение (на С#) при работе? Либо "участок кода" - допустим есть метод который считывает данные, можно ли узнать сколько памяти он потребляет во время работы.
ds.ReadXml(xml);
IDE - VS2012


Ответ

Отслеживание изменений в оперативной памяти:
С помощью кода:
long before = GC.GetTotalMemory(false); // ваш код тут long after = GC.GetTotalMemory(false); int consumedInMegabytes = (after - before) / (1024 * 1024);
Опционально может потребоваться собрать мусор до и/или после тестируемого кода (параметр GetTotalMemory поставить в true). С помощью профайлеров (суть аналогична): снять снэпшот до тестируемого кода, выполнить код, снять снэпшот после, сравнить два снэпшота. Профайлер поможет ответить не только на на вопрос "сколько?", но и "на что?".

среда, 12 декабря 2018 г.

Сборка приложения для windows с использованием visual studio

Доброго времени суток!
Разрабатываю понемножку с использовванием visual studio(13), и постоянно мучит особенность сборки под винду, которая заключается в следующем: для корректной работы на другом компьютере необходимо ручками докладывать библиотеки, которые приложение просит на выходе. В то же время, когда приложение собирается в релизе и запускается, то студия автоматически подкадывает нужные библиотеки, что б приложение могло запуститься.
Что необходимо сделать для того что бы студия скопировала все необходимые для работы библиотеки в папку рядом с ехе-шником?


Ответ

Стандартно, в студии ничего подобного не предусмотрено. Предпологается, что разработчик сам знает какие библиотеки используются в его проекте и сам ими управляет.
Однако, есть библиотеки которые могут линковаться неявно, при этом способ линковки (статическая/динамическая) можно настраивать в параметрах проекта:
CRT - настраивается параметром "C/C++\Code Generation\Runtime Library", по-умолчанию включена динамическая линковка и именно из-за нее у новичков возникают проблемы при распространении ПО; если включить статическую линковку то DLL тянуть не потребуется. MFC - настраивается "General\Use of MFC", по-умолчанию не используется ATL - настраивается "General\Use of ATL", по-умолчанию не используется
Проблема в том, что на машине разработчика все эти библиотеки устанавливатся вместе со студией и поэтому ПО запускается из любого места. А вот на машине пользователя этих библиотек часто нет, от сюда у новичков и возникают проблемы. Проблема решается либо статической линковкой, либо установкой соответсвующих пакетов (редистов) нужных версий (ссылки успешно яндексятся на сайте Майкрософта)
Вторая проблема в том, что при автоматической загрузке DLL, требуется чтобы все библиотеки в пределах одного бинаря линковались одинаково. Это означает, например, что если QT слинковам с CRT динамически то и наш бинарь должен линковать CRT динамически. Это можно обойти, если применять не автоматическую а ручную загрузку DLL, но тогда гемор разрастется многократно. Проще немного увеличить инсталянт в размере, може мне поверить.

понедельник, 10 декабря 2018 г.

Доступ к private методам

Как получить доступ к private методу? C#, VS 2012. Спасибо. P.S. Прежнее название темы - "Unit Test для private методов"


Ответ

Решение - использовать Reflection например так: var field = typeof(CopyItems).GetMethod(("FixRenamedPath"), BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
string targetFile = (string)field.Invoke(null, new object[] { renamedFile, relatedFile, targetDir });

среда, 17 октября 2018 г.

Как сделать единую версию для всех проектов решения

Есть решение, в нем несколько проектов. Например, проекты: осн. прилож., сервис прилож., библиотека1, библиотека2. У каждого проекта своя версия, свой файл assembly.cs Как сделать файл общим, или версию общую?
Видел вариант, когда у основного проекта файл, а у остальных файла физически нет, но в дереве проектов есть и значок типа ярлыка.
Как это сделать?


Ответ

Очень просто.
Заведите в общем для всех проектов месте файл CommonAssemblyInfo.cs, в котором укажите общую для всех проектов информацию (например, версию).
Для каждого из проектов, который должен это использовать, удалите эту самую информацию из AssemblyInfo.cs (этот файл обычно находится в каталоге Properties в стандартном проекте). Добавьте CommonAssemblyInfo.cs в проект через Solution explorer → проект → Add... → Existing Item → CommonAssemblyInfo.cs, не забудьте выбрать «Add as link»

Переместите добавленную ссылку в каталог Properties внутри проекта.
Для ваших целей в CommonAssemblyInfo.cs имеет смысл указать
[assembly: AssemblyVersion("10.1.0.0")] [assembly: AssemblyFileVersion("10.1.0.0")] // File version в свойствах DLL [assembly: AssemblyInformationalVersion("10.1.0.0")] // Product version в свойствах DLL