Страницы

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

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

вторник, 25 февраля 2020 г.

Visual Studio 2015, ASP.NET 5, Локальный сервер IIS

#aspnet_mvc #iis #visual_studio_2015


Есть проект написанный на ASP.NET 5.
Требуется запуск из Visual Studio 2015 в режиме отладки, но чтоб была возможность
подключения к нему по внешнему статическому IP.
Я так понимаю нужно использовать локальный сервер IIS.
Но как это настроить ?
    


Ответы

Ответ 1



Запустить студию с правами администратора Открыть свойства веб проекта в студии Перейти на закладу Web Сменить значение в комбобоксе Servers с IIS Express на Local IIS Нажать Create Virtual Directory Приложение будет доступно по Project Url, с подстановкой IP или внешнего имени машины вместо localhost. Запустить отладку можно по F5, или прицепившись у уже запущенному w3wp.exe через Debug → Attach To Process. Или можно просто вручную создать Application в IIS Manager, зайти на сайт, и точно так же прицепится отладчиком студии.

понедельник, 24 февраля 2020 г.

Выполняется старая версия кода

#cpp #visual_studio_2015


Установил Visual Studio 2015. Создал проект. написал простую программу из разряда
"привет мир". В какой то момент перестает компилироваться программа, то есть меняю
реплику на "мир привет", а выдается "привет мир". То есть старый exe файл запускается.
Кто подскажет как побороть?
    


Ответы

Ответ 1



Причина запуска старого варианта кода может быть в том, что новый код содержит ошибки и согласно настройкам среды производится запуск последней удачной сборки. Проверьте настройки на странице Tools - Options - Projects & Solutions - Build & Run:

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

Как определить метод для делегата автоматически?

#c_sharp #visual_studio #visual_studio_2015


Если заголовок не понятен, то объясню другими словами. Есть, например ExecutedRoutedEventHandler.
Как мне быстро получить из него 

void FirstPageCommand(object sender, ExecutedRoutedEventArgs e)
{

}


? Короче как можно быстро раскрыть хандлер в функцию в коде? Напечатал я такой ExecutedRoutedEventHandler
+=, чего нибудь нажал, а функция бы создалась сама. Может есть горячие клавиши для
этого? А то приходится возвращаться к хандлеру, наводить на него, чтобы посмотреть
типы параметров.
    


Ответы

Ответ 1



Пишете ExecutedRoutedEventHandler +=, потом нажимаете Tab -- добавляется название сгенеренного метода, потом еще раз Tab -- генерится сам метод.

среда, 5 февраля 2020 г.

Как открыть окно “Средства диагностики” в Visual Studio 2015?

#visual_studio_2015


Искомое окно выглядит следующим образом:



Как получить к нему доступ?
    


Ответы

Ответ 1



Данное окно доступно в пункте меню Debug Debug→Windows→Show Diagnostic Tools Либо по горячим клавишам: Ctrl+Alt+F2

Ответ 2



В дополнение могу сказать, что начиная, кажется, с 2013 Студии появилось универсальное окно поиска, расположенное справа вверху. Стоит в него ввести, например, "diag", как вывалится список со всеми окнами и опциями, которые имеют в названии "diag". Очень удобная вещь, когда не знаешь/не помнишь, где находится нужное окно или настройка.

понедельник, 3 февраля 2020 г.

Запись в файл с++

#cpp #visual_studio_2015


Прога записи в файл:

int main()
{
    setlocale(LC_ALL, "Russian");
    char recvbuf[] = "Привет!";
    std::string sstr(recvbuf);
    std::fstream myfile;
    do
    {
        myfile.open("Kuha.txt", std::fstream::app);
        if ( myfile )
        {
            myfile << sstr << '\n'; std::cout << "файл записан " << '\n';
            system("pause");
        }
        else
        {
            std::cout << "ошибка записи файла " << '\n';
            system("pause");
        }
    }
    while ( !myfile );
    myfile.close();
    std::cout << "выход из цикла записи файла " << '\n';
    system("pause");

    return 0;
}


Если запустить сразу два экземпляра, то второй ошибку открытия файла не выдает. А
ведь должен?
    


Ответы

Ответ 1



Файлы через std::fstream открываются в режиме общего доступа. Иными словами, любой другой процесс может открыть тот же самый файл как для чтения, так и для записи. Чтобы запретить другим процессам обращаться к файлу, необходимо открывать его в режиме монопольного доступа, т.е. заблокировать. Linux Можно использовать функцию flock. Она блокирует доступ к файлу по его дескриптору. Но получить дескриптор файла для потока стандартными средствами нельзя, поэтому придётся для ввода-вывода использовать системные функции read и write. Пример использования: int fd = open("FILE_NAME", O_RDWR| O_CREAT); flock(fd, LOCK_EX); char buffer[100]; read(fd, buffer, 100); write(fd, buffer, 100); flock(fd, LOCK_UN); close(fd); Windows Можно использовать функцию WinAPI CreateFile, передав в третьем аргументе (dwShareMode) режим совместного доступа. Например, указав 0, вы откроете файл монопольно, никто другой даже на чтение открыть его не сможет. Но тогда и для всех остальных операций придётся использовать WinAPI: ReadFile, WriteFile, CloseHandle и т.д. Пример использования: HANDLE hFile = CreateFile("FILE_NAME", GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); char buffer[100]; DWORD numberOfBytesRead, numberOfBytesWritten; ReadFile(hFile, buffer, 100, &numberOfBytesRead, NULL); WriteFile(hFile, buffer, 100, &numberOfBytesWritten, NULL); CloseHandle(hFile); Microsoft Visual C++ Существует ещё один метод, но он непереносим даже в пределах одной платформы и является зависимым от компилятора. Microsoft Visual C++ предоставляет перегруженный вариант функции std::fstream::open, имеющий дополнительный аргумент, задающий режим совместного владения для файла. Пример использования: std::fstream file; file.open("FILE_NAME", std::fstream::app, _SH_DENYRW); // ...

Ответ 2



fstream не блокирует файл для открытия другими приложениями. Для этого вам нужно воспользоваться функциями ОС (для Windows — CreateFile(), правда тогда для чтения и записи также придется пользоваться системными функциями), или, так как вы используете MSVC, можно передать функции std::fstream::open (ну или конструктору fstream) третий аргумент, который определяет режим доступа к файлу другими процессами, например, если вы хотите запретить доступ всем иным процессам к файлу, это будет выглядеть так: #include #include std::fstream myfile("Kuha.txt", std::fstream::app, _SH_DENYRW);

пятница, 24 января 2020 г.

Где править генераторы кода в Visual Studio?

#visual_studio #visual_studio_2015


Visual Studio умеет, например, создавать обработчики событий автоматически. Я могу
создать обработчик прямо из XAML разметки, при этом в коде создается что-то типа 

private void Button_Click(object sender, EventArgs e) { }


Но у нас стиль кода подразумевает отсутствие модификатора доступа private, так как
он используется по умолчанию. Так вот, вопрос: как научить студию при автоматическом
создании обработчиков не добавлять слово private?
    


Ответы

Ответ 1



Задавать параметры для генерации кода Visual Studio можно в окне "Tools->Options-Text Editor->C#->Code Style" и еще в соседних узлах относительно узла Code Style. На сколько я знаю там нельзя задать параметры для генераций событий. Также есть расширение для Visual Studio, но оно работает только с WinForms (автор говорит что для WPF редактора невозможно реализовать данное расширение). Для общего стиля кода в команде использую ReSharper с общими настройками.

Копировать проект в папку с номером версии проекта

#c_sharp #visual_studio_2015 #msbuild


Хочется использовать версионность приложения как нынче у браузеров - в подпапках
лежат целиком старые и новые версии и какую запускать решает лишь простой лаунчер:



Вопрос - можно ли в проекте на событиях билда(до сборки, после сборки, не важно по
идее) как то указать копирование не в конкретную подпапку, а в ту, которая соответствует
текущей версии проекта?
Интересуют реализации как без сторонних утилит, так и с ними, если других вариантов нет.
    


Ответы

Ответ 1



Удалось найти решение на SO. Выгружаем проект лаунчера и пишем в него: $(PostBuildEventDependsOn); PostBuildMacros; md "$(TargetDir)\@(VersionNumber)" xcopy /y /r /e "$(ProjectDir)\..\Core\bin\$(ConfigurationName)" "$(TargetDir)\@(VersionNumber)" Насколько понимаю, решение получилось немного сборку, ведь версия берется от самого лаунчера. Для меня это не проблема, т.к. использую одну версию на всё решение.

среда, 22 января 2020 г.

Xamarin и ошибки компиляции

#c_sharp #visual_studio #visual_studio_2015 #xamarin


Я пользуюсь Xamarin for VS2015. Летом я установил Xamarin на личный компьютер. Там
до сих пор всё работает, там можно создавать приложения. Другое дело - рабочий компьютер.
Туда я установил Xamarin в октябре. И пошло-поехало... Начнём с того, что как только
я компилирую программу на каком либо устройстве, VS ждет, что-то делает, и говорит,
мол, что при сборке возникли ошибки. А окно ошибок ничего не показывает. 

Я думал, что проблема в эмуляторе( я бедное существо у которого нет смартфона). Поэтому
использовал прилагающийся эмулятор от Google. Не работало. Просто не запускалось, хотя
писало "Готово". После использования Nox Emulator, понял что просто код не так компилируется.
APK файл появился - но не работает.

И да... Всё это шаблон, начальный код. То есть после создания проекта я ничего не
менял. Не работает!

Что надо сделать, чтобы исправить проблему?
    


Ответы

Ответ 1



Бывают разные случаи. Когда такое возникает. Чаще всего. Достаточно удалить bin и obj в проекте. И проблема уходит. Проверяйте настройки проекта. Такие у меня настройки. Может стоять лишняя галочка предназначенная только для Release. Проверьте Advanced properties / Support architectures (для эмуляторов должны стоять галочки x86_64 и/или x86 В путях к sdk и ndk не должно быть русских символов Обновите sdk, ndk до последних версий. Если выше перечисленное не помогло. И Вы используете шаблонное приложение. Попробуйте переустановить sdk, ndk или обновить плагин для Visual Studio. Иногда помогает и это. Но это редкий случай. Не использовать эмуляторы Apache Cordova. Только от google либо Microsoft. Примерные действия. Которые мне помогают решать такую проблему. Которая периодически возвращается.

Ответ 2



На самом деле, ответ на вопрос нашёл самостоятельно, когда читал документацию к эмулятору... Заметим, что в каждом неудачном случае, я использовал слабые компьютеры. Поэтому, собственно говоря и возникла ошибка с эмулятором. Решение проблемы: купить смартфон и не мучаться.

Ответ 3



Не каждый смартфон будет работать,у меня на одном компе нормально эмуляцию делает,на другом просто беда,можно пробовать использовать разные эмуляторы,например есть эмулятор bluestack, у эмулятора от студии то-ли на 10,то-ли на 8ке бывают баги связанные с inteL HAXM к примеру.

пятница, 10 января 2020 г.

Сборка проекта С++/С# из командной строки

#cmd #visual_studio_2015 #build


Требуется собрать проект с помощью bat-файла. Параметры сборки следующие:

MsVstudio\incredibuilder - тип сборки локальная\распределенная
win32\x64
debug\release
build\rebuild


Можно ли как-то при запуске VS передать в неё такие параметры? Читал про команду
devenv, она даёт возможность только указать Build или Rebuild.
    


Ответы

Ответ 1



Вам нужен MSBuild - это утилита от Майкрософта, которая умеет с командной строки собирать проекты. А вот прикрутить ее в бат файл - это уже простая задача. Как собрать проект в релизе? MSBuild.exe C:\Folder with Solution\My Solution.sln /property:Configuration=Release как собрать и дебаг, и релиз? MSBuild.exe C:\Folder with Solution\My Solution.sln /property:Configuration=Debug;Release Хочется чего то больше - читаем документацию https://msdn.microsoft.com/ru-ru/library/ms164311.aspx P.S. Возможно, придется запускать "VS2015 x86 Native Tools Command Prompt" (ну или под Вашу версию студии) и в его консоли уже выполнять сборку.

Ответ 2



В общем локальная сборка делается с помощью MSBuild, как мне посоветовали выше. Полный пример: msbuild.exe %SolutionPath% /t:build /p:configuration=release /p:platform=x86 Запускается из Bat, только после перехода в каталог, в котором находится MSBuild. Распределённая сборка, через IncrediBuild, делается через BuildConsole: BuildConsole.exe %SolutionPath% /build /cfg="release|x86" Является командой самой windows cmd, так что ничего придумывать не надо.

четверг, 2 января 2020 г.

Расшифровка пиктограмм в Visual Studio 2015

#c_sharp #visual_studio_2015


Не могу найти никакой документации по вопросу, о том, что означают различные значки
и пиктограммы в VS2015. Пользуясь отладчиком столкнулся с непонятными обозначениями
при проверке свойств модели. Это когда во время отладки можно навести курсором на объект
и среда отображает окно с полями объекта и значениями, которые эти поля содержат. 



Собственно, что означает гаечный ключ я понял - это доступные свойства, а что за
простите "синяя коробка" со "знаком стоп" я так и не понял. Единственное, я не могу
получить к ним доступ.
    


Ответы

Ответ 1



Добавлю сюда, на всякий случай. Т.е в моем случае, это "запечатанное поле", так Field of variable в первой таблице, и соответствует sealed сигнал из второй.

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

Ввод/вывод в консоли, C++

#cpp #visual_studio_2015 #консоль #вывод #ввод


Здравствуйте.

Решил написать небольшую RPG-игру с псевдографикой в консоли. 
Для считывания нажатий клавиш использовал функцию GetAsyncKeyState из Windows.h

bool isKeyPressed(int virtualKeyCode)
{
    short keyState = GetAsyncKeyState(virtualKeyCode);
    return ((keyState & 0x8000) > 0);
}


В функции Update проверяю состояние клавиш и изменяю направления движения героя.

 void Update()
    {
    if(_kbhit())
    {   if (isKeyPressed('W'))
        {
            unitsArr[heroIndex].changeMoveDirectionTo(0, -1);
            moveUnitTo(&unitsArr[heroIndex]);
        }
        else if (isKeyPressed('S'))
        {
            unitsArr[heroIndex].changeMoveDirectionTo(0, 1);
            moveUnitTo(&unitsArr[heroIndex]);

        }
        else if (isKeyPressed('A'))
        {
            unitsArr[heroIndex].changeMoveDirectionTo(-1, 0);
            moveUnitTo(&unitsArr[heroIndex]);

        }
        else if (isKeyPressed('D'))
        {
            unitsArr[heroIndex].changeMoveDirectionTo(1, 0);
            moveUnitTo(&unitsArr[heroIndex]);
        }
    ...
    }


После этого захотел написать функцию, которая выводила бы на экран вопрос, и при
помощи _getch() считывала бы ответ игрока (y/n)

bool getAnswerFromLogPanel(const string questionMessage)
{
    UpdateLog(questionMessage + " [Y]/[N]");

    const char inputAnswer = tolower(_getch());
    if (inputAnswer == 'y')
    {
        UpdateLog("[Y]");
        return true;
    }

    UpdateLog("[N]");
    return false;
}


Здесь столкнулся с проблемой, что _getch() не останавливает поток и не ждет нажатия
клавиши.

При этом если использовать вместо _getch() функцию getchar() или cin.get() на экран
консоли выводятся символы ранее нажатых клавиш.





Как я понял,_getch() просто считывает один символ из последних нажатых клавиш (те,
которые выводит на экран getchar() или cin.get()) и поэтому не останавливает поток.

То что мне не помогло:

cin.ignore(), cin.clear(), cin.sync(), system("cls"), fflush(stdin).

То что работает, но не так как надо:


Работает, но если до этого когда-то была нажата клавиша Y или N - ответ будет считываться
с нее.

do
{
    char input = _getch();
    input = tolower(input);

    if (input == 'y')
   {
       UpdateLog("[Y]");
       return true;
   }

    if(input == 'n')
    {
        UpdateLog("[N]");
        return false;
    }
} while (true);

При каждом срабатывании _kbhit() считывать при помощи _getch() символ с потока.
Но тогда движение героя и реакция на нажатия клавиш значительно замедляется.


C++, Visual Studio 2015
    


Ответы

Ответ 1



Поскольку потоковое чтение работает в конечном итоге через WinAPI-шные функции и не ожидает, что будет использован прямой доступ к тем же функциям, то оно не дружит с низкоуровневым вводом через GetAsyncKeyState. Поэтому, если уж вы пользуетесь низкоуровневыми функциями, пользуйтесь ими всё время. Для вашего случая, вам должны помочь FlushConsoleInputBuffer (чтобы сбросить буферизацию уже нажатых к текущему моменту клавиш) и ReadConsoleInput. Вот общая страница документации, на всякий случай.

среда, 25 декабря 2019 г.

Стандарнтые заголовочные файлы внутри stdafx.h

#cpp #visual_studio_2015 #header


Стоит ли включать в предкомпилированный заголовочный файл stdafx.h заголовочные файлы
стандартной библиотеки (string, algorithm и т.п.), ведь они не изменяются? 

Смущает то, что необходимо писать #include "stdafx.h" в каждом .cpp файле. Используется
Visual Studio 2015.
    


Ответы

Ответ 1



Если вы приняли решение использовать Precompiled Headers (для ускорения сборки), то заголовки стандартных библиотек нужно включать в stdafx.h ведь для этого весь сыр-бор и затевается, чтобы их один раз компилятор распарсил, и далее для всех остальных файлов уже использовал приготовленные (прекомпилинные) файлы. Соответственно как раз не изменяемые файлы и надо включать в него, чтобы не вызывать лишний раз пересборки этих precompiled headers. Механизм прекомпиленных заголовков довольно гибкий. Вы можете отключить его полностью, или для отдельных файлов. А также для одной группы файлов использовать один precompiled header, для другой группы другой. Ну и имя stdafx.h хоть и по дефолту, но не фиксированное, можете изменить на любое другое.

Ответ 2



Если я правильно понял ваш вопрос, то я не советую включать заголовочные файлы внутрь заголовка . Во-первых, это делает код менее читабельным, так как сеет сомнение у читающего ваш код, включили ли вы правильно все заголовки, или программа компилируется лишь из-за того, что в некоторой реализации стандартной библиотеки в стандартный заголовок был включен другой стандартный заголовок. Во-вторых, такой код не будет переносим на платформы, где отсутствует заголовок . Если же не включать в него заголовочные файлы, то вам будет достаточно просто его закомментировать или удалить. То есть упрощается работа. И никто не будет спрашивать, а что это за заголовок.

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

Какие файлы должны быть в релизной сборке?

#c_sharp #net #visual_studio #visual_studio_2015


Добрый день!

Похоже я достиг нового этапа в становлении программистом, когда зашел в папку с одной
из разработанных программ, и стал немыслимо негодовать с криками "Что за хрень?!!".

Всем нам, еще с тех времен, когда игры качали с торрентов, а для активации и взлома
игры нужно было файлы из папки "Crack" поместить в папку с игрой, знакома картина,
как должны выглядеть внутренности софта. В этих папках все хорошо структурировано:
несколько папок с библиотеками и ресурсами и сам ярлык игры.

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

Сразу хочу сказать, я искал и гуглил информацию по вопросам, которые описаны ниже,
но многие темы которые могли бы мне помочь созданы давно и скорей всего люди отвечавшие
там не смогут мне быстро дать дополнительные разъяснения.

Буду благодарен любой информации, как личному объяснению, так и ссылкам на умную
и нудную документацию.

Программирую на C#, использую для этого Visual Studio 2015 и Visual Studio 2017. 

Сами вопросы:


Как разложить библиотеки и файлы программы по соответствующим папкам?
Нашел способ с прописыванием в файл с конфигурацией, но неужели это единственный
способ? Уверен есть куда более изысканный и красивый способ это сделать!
Зачем нужны файлы .pdb в релизной сборке и возможно ли от них избавиться? И если
возможно то как?
Нужны ли файлы .xml в релизной сборке? И если не нужны, то как от них избавиться?


P.s. Файлы .vshost.ext и manifest я догадался как отключить и их назначение знаю))

Всем спасибо за потраченное время и помощь!
    


Ответы

Ответ 1



В типовом проекте студия сама автоматически сложит все файлы в каталоге out/release как нужно. Наводить порядок вручную не стоит: на это тратится время, а смысла особого в наведении порядка ради порядка нет. Если вам всё же нужно что-то нестандартное... Откройте Рихтер CLR via C#, Глава 2 Компоновка, упаковка, развертывание и администрирование приложений и типов, "Алгоритм поиска файлов сборки", там есть краткое описание о том, как ищутся сборке в каталоге приложения (для закрытого развёртывания). Подключиться отладчиком. Если вам это не нужно - можно отключить в свойствах проекта (закладка Build - Advanced) для release режима. Подробно можно почитать на английском: https://stackoverflow.com/a/5457250/5752652 или у того же Рихтера. Сильно зависит от того, что это за xml-файлы. Конкретные примеры?

Ответ 2



Никак. Не надо ничего раскладывать по отдельным папкам, если это не вызвано какой-то реальной необходимостью (например, механизм загрузки ресурсов может искать сборки в папках с именами ru-ru и en-us). Нужны для отладки релизной сборки. В окончательный инсталлер их можно не включать, но если есть хоть какая-то вероятность отладки релиза, хотя бы на стадии предрелизного тестирования - стоит сохранить копию pdb. MS есть отдельный "сервер" для хранения символов - набор утилит для организации хранения pdb. XML документация - файлы с именами someassembly.xml - не нужны, кроме случая, когда ваш продукт - это именно сама сборка. Все остальное - зависит от того, что это за файлы. XML - это просто формат, в файле может лежать что угодно, так что в общем виде заранее оценить его необходимость невозможно.

Как задать структуру выходного проекта?

#c_sharp #net #visual_studio_2015


По умолчанию VS при компиляции кладет все в одну директорию рядом с EXE.

Т.е и сборки и все остальное лежат в одной папке.

Как создать свою собственную структуру? 

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


Ответы

Ответ 1



Ну это как бы можно. Для начала, вы добавляете каталоги, в которых будут лежать ваши библиотеки, в assembly probing path. Для этого отредактируйте ваш app.config, добавьте в него следующее: (Документация.) Затем, в свойствах проекта в зависимостях укажите CopyLocal = False: Затем, в свойствах проекта-библиотеки установите Output Path в каталог, где вы хотите получить эту DLL (для каждого из ваших target platform/processor): Ну или в post-build step каждого из зависимых проектов укажите вручную копирование куда надо. Всё, должно работать. Как советует @Andrew B в комментариях, существует ещё один путь, описанный в документации: подписаться на событие AssemblyResolve, которое отправляется, если .NET не может загрузить сборку из вашего каталога. Для этого нужен код наподобие такого: AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve; где метод OnAssemblyResolve определён так: Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) { var name = args.Name.Substring(0, args.Name.IndexOf(",")); // проверка на то, есть ли загружаемая сборка среди наших статических ссылок // взята из https://support.microsoft.com/ru-ru/kb/837908 // но вам может быть и не нужна, подумайте сами if (!Assembly.GetExecutingAssembly().GetReferencedAssemblies() .Any(asmName => asmName.FullName.Substring(0, asmName.FullName.IndexOf(",")) == name)) { // это не assembly из наших ссылок return null; } var applicationDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); foreach (var subfolder in new[] { @"some\subfolder", @"another\subfolder" }) { var path = Path.Combine(applicationDir, subfolder, name + ".dll"; if (File.Exists(path)) return Assembly.LoadFrom(path); } return null; } (Не тестировал.) Достоинство этого решения — то, что список путей можно изменять динамически, если это вдруг понадобилось. Недостаток — то, что у вас некоторые сборки будут грузиться в assembly binding-контексте LoadFrom в отличие от обычной загрузки в контексте Load. Типы, загруженные в таком контексте, будут несовместимы с типами, загруженными в обычном контексте. Особенно это может «клюнуть», если у вас в разных местах лежат разные версии одной и той же сборки. [Это может привести к эффекту, когда один и тот же статический класс существует в двух экземплярах.] Будьте осторожны и готовы к неожиданностям! (Вопрос также обсуждался здесь.) Если ваши сборки приходят с ресурсами, возможно, вам нужно учесть эту модификацию. Дополнительное чтение по теме assembly binding/load context: Best Practices for Assembly Loading Suzanne Cook, LoadFile vs. LoadFrom Для автоматического копирования сборок в целевые каталоги посредством MSBuild посмотрите ответы к этому вопросу. Но в целом, я бы порекомендовал воспользоваться советом @TomTom и не заморачиваться, а оставить всё как есть. То, что файлы лежат в одном каталоге, пользователь не увидит, если вы правильным образом поместите ярлыки в системное меню при инсталляции (а вы в любом случае должны это сделать).

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

Как положить свой ProjectTemplate в раздел VisualSudio (Visual C#/Web)?

#c_sharp #visual_studio #visual_studio_2015 #visual_studio_extensions


Привет! Я пытаюсь затолкать свой шаблон проекта в (Visual C#/Web)(Аналогично тому
как там лежит DevExpress Template Gallery на моём скриншоте). Пытаюсь сделать это следующими
строками кода в файле MyTemplate.vstemplate:


My Template Gallery
Start Template Gallery
myProj.ico
CSharp
Web
Web
4.0
0
0
4d72892d-abc3-428d-8fa7-8421a83d6e0a
true
XafariApplication
true




    


Ответы

Ответ 1



Ручной способ Создаете проект. Заполняете нужными начальными файлами для шаблона. Сохраняете. В меню Файл выбираете Экспорт шаблона. В Wizard'е выбираете: Project Template. Заполняете поля. Архив закинется в папку <Рабочая папка студии>\My Exported Templates и в папку <Рабочая папка студии>\Templates\ProjectTemplates (если не сняли галку в wizard'е): Этот архив нужно поместить в папку <Рабочая папка студии>\Templates\ProjectTemplates\Visual C#\Web (ее нет, поэтому необходимо создать): Заходите в студию. И Profit. С помощью VSIX Дожен быть готов архив. Смотри 1-5 пункты ручного способа. Создаете проект VSIX. В проекте создаете нужную иерархию папок. В данном случае получается следующая иерархия: Закидывайте архив в папку ProjectTemplates\CSharp\Web. В манифесте указываете нужные данные. Затем заходите в пункт Assets и добавляете: Сохраняетесь. Билдитесь. Запускаете VSIX. Открываете студию. ProjectTemplate + VSIX Создаете проект типа ProjectTemplate заполняете его. Выбираете в студии файл с расширением *.vstemplate (по умолчанию его имя совпадает с именем проекта). И в его свойствах в строке Category прописываете путь иерархии, который будет начинаться от CSharp. Т.е. если указываете SubA/SubB/SubC, то шаблон будет лежать в CSharp/SubA/SubB/SubC. В нашем случае указываем только Web: Создаем проект VSIX. В манифесте указываете нужные данные: Билдитесь. P.S. Немного про элемент TemplateData. Вы указали ProjectSubType значение Web, но этот элемент может иметь только всего 4 значения: SmartDevice-NETCFv1 - указывает поддержку .NET Compact Framework версии 1.0 SmartDevice-NETCFv1 - указывает поддержку .NET Compact Framework версии 2.0 CSharp - Задается только тогда, когда элемент ProjectType имеет значение Web (т.е. это проект типа веб-сайт). Указывает на языка программирования. VisualBasic - тоже самое, что и предыдущий пункт, только язык программирования VisualBasic.

Конвертация кода C# => VB.NET

#c_sharp #vbnet #visual_studio_2015


День добрый. Переписывал библиотеку с C# на более удобный для себя VB.NET и не смог
разобраться как написать два куска кода.

Код 1.

throw new RucaptchaErrorException((RucaptchaError)Enum.Parse(typeof(RucaptchaError),
str.Substring(6)));


Попытка получить хоть какой то код через декомпилятор выглядит так:

Throw New RucaptchaErrorException(DirectCast(Enum.Parse(GetType(RucaptchaError),
Str.Substring(6)), 
RucaptchaError))


Код 2.

public object Clone()
{
    var paramsContainer = new ParamsContainer();
    foreach (var obj in from object index in Params.Keys select (Param) Params[index])
        paramsContainer.Params.Add(obj.Key, obj);
    return paramsContainer;
}


При попытке конвертнуть этот метод, у декомпилятора вообще снесло крышу и получившийся
кусок даже не стоит приводить.

Прошу помощи.
    


Ответы

Ответ 1



Код 1: Throw New RucaptchaErrorException(DirectCast(System.Enum.Parse(GetType(RucaptchaError), str.Substring(6)), RucaptchaError)) Код 2: Option Infer On Public Function Clone() As Object Dim paramsContainer = New ParamsContainer() For Each obj In From index As Object In Params.Keys Select CType(Params(index), Param) paramsContainer.Params.Add(obj.Key, obj) Next obj Return paramsContainer End Function p.s. могут быть ошибки, использовал конвертер: http://www.tangiblesoftwaresolutions.com/Free_Edition_Downloads/Instant%20VB%20(Free%20Edition)%20Setup.exe

понедельник, 25 ноября 2019 г.

Как узнать, откуда был вызван метод?


Есть громоздкий код, выполняю его отладку. Есть метод, который часто вызывается и
разных мест. Можно ли по точке останова узнать, откуда он был вызван? Или может можно вернуться назад по шагам?
    


Ответы

Ответ 1



Посмотреть откуда был вызван метод можно в окне Debug → Windows → Call Stack В нем же можно просмотреть значения локальных переменных в вызывающих методах. даже поставить брекпойнт на момент возврата в вызывающий метод - например, выбрав Main на скриншоте и нажав F9 (прямо в этом окне, а не в исходнике Main). "Отмотать назад" тоже можно. Но только в Visual Studio Enterprise 2015 при заранее влюченной опции сборки информации о вызовах (Tools/Options/IntelliTrace/events and call information) Debug → Windows → IntelliTrace Calls:

Ответ 2



Дополнение к другим ответам: Если вы не хотите каждый раз останавливать программу, попробуйте просто залогировать строку new System.Diagnostics.StackTrace().ToString(); Например, System.Diagnostics.Debug.WriteLine(new System.Diagnostics.StackTrace().ToString()); распечатает текущий стек в окно отладки Output.

Ответ 3



В дополнение к сказанному, можно создать специальный метод для трассировки, вложит его во все диагностируемые методы. Атрибут CallerMemberName (.NET 4.5) поможет определить вызывающий метод. Пример с MSDN: public void DoProcessing() { TraceMessage("Something happened."); } public void TraceMessage(string message, [System.Runtime.CompilerServices.CallerMemberName] string memberName = "", [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "", [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0) { System.Diagnostics.Trace.WriteLine("message: " + message); System.Diagnostics.Trace.WriteLine("member name: " + memberName); System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath); System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber); } // Sample Output: // message: Something happened. // member name: DoProcessing // source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs // source line number: 31 p.s. так же можно просто добавить нужные атрибуты в параметры диагностируемого метода и передавать их в метод трассирови, либо сразу выводить через System.Diagnostics.Debug или System.Diagnostics.Trace.

понедельник, 15 июля 2019 г.

Добавление папок и файлов в конечный zip архив шаблона проекта VS 2015 во время сборки

Здравствуйте друзья!
После создания проекта Visual Studio (Visual C#\Extensibility\C# Project Template), удаления тега вместе с его содержимым в файле MyTemplate.vstemplate мы получаем вот такой проект:

После сборки этого проекта в папке **bin** образуется архив с двумя файлами:

Как настроить проект таким образом, что-бы при сборке в этот архив ложилась ещё произвольная папка с произвольными файлами из проекта?

При этом нельзя что-бы шаблон генерировал все эти файлы при запуске его ярлыка из VisualStudio(т.е. нельзя добавлять файлы в файл с расширением .vstemplate как я понимаю)
(А делать этого нельзя т.к. этот шаблон используется для вызова WizardTemplate который уже сам генерирует шаблон по пути который передан от самого Template. А собственно файлы которые находятся в шаблоне по условию нужно использовать в этом Wizard'e. Такие дела)
Заранее спасибо за помощь!


Ответ

Смог решить данную проблему с помощью Post Build Action. Файлы прикрепил к проекту с действием при компилляции "None", а в PostBuildAction написал скрипт доупаковку архива zip с помощью утилиты 7z.

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

Не открываются представления в ASP.NET MVC

При попытке открыть любое представление (cshtml) в проекте вылетает следующая ошибка "Ссылка на объект не указывает на экземпляр объекта" (Рис. 1)

В новом проекте и новом представлении та же ошибка.


Ответ

Думал уже переустанавливать VS, но нашел решение необходимо удалить каталог ComponentModelCache путь C:\Users\User\AppData\Local\Microsoft\VisualStudio\14.0
Источник информации

понедельник, 8 июля 2019 г.

Выполнение Delete при билде

Visual Studio 15
Во время билда (неважно по нажатию F6 и через меню Build) если курсор находится в редакторе то он удаляет следующий за ним символ (как будто delete нажимает) Та же история если запускать отладку ( F5 или Run )
В чём может быть причина такого поведения? Как отключить?


Ответ

посмотреть список расширений, которые установлены. Отключить сомнительные. просто запустить devenv с параметром /SafeMode. Если проблема уйдет, методом тыка понять, кто шалил, постепенно отключая расширения. Не исключено, что некоторые расширения конфликтуют. классика - проверить машину любым антивирусом/запустить винду в сейфмоде.