Страницы

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

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

суббота, 11 апреля 2020 г.

Сервис не стартует, выдавая ошибку 1053

#cpp #visual_studio #service #visual_studio_2013 #windows_service

                    
Собираю сервис с использованием с++. За основу брал условно-рабочий example, попытки
запустить сервис проводил на нем.
Запускаю код на своей машинее в дебаге/релизе/как обычное приложение/как сервис -
все работает. При попытке запустить данное творение на другой машине как обычное приложение
комп просто не выдает никакого окна. 

В принципе, как понимаю, сервисы и не обязаны отрабатывать как обычные приложения,
поэтому пытаюсь его установить как сервис.(в ком строке от имени админа sc create SERVICENAME
binpath= C:/[---].exe) Устанавливается. Новый процесс появляется в списке сервисов,
при попытке его стартануть (sc start SERVICENAME) комп вежливо отвечает, что 


  the service did not respond to the start or control request in a timely fashion


т е запуск сервиса не модет быть произведен т к сервис не отвечает. 
Как можно с этим справиться?

P.S. вот здесь сырцы полностью.
далее - исходный код самого сервиса

// SimpleService.cpp : Implementation of WinMain

#include "stdafx.h"
#include "resource.h"
#include "SimpleService.h"

class CSimpleServiceModule : public CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >
{
public :
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_SIMPLESERVICE, "{01D73C58-D8F4-4A85-B27D-424443739977}")
    HRESULT InitializeSecurity() throw()
    {
        return S_OK;
    }

    HRESULT PreMessageLoop (int nShowCmd);
    void RunMessageLoop (void) throw();
    void OnContinue (void) throw();
    void OnPause (void) throw();
    void OnShutdown (void) throw();
    void OnStop (void) throw();
};

HRESULT CSimpleServiceModule::PreMessageLoop (int nShowCmd) throw()
{
    return CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::PreMessageLoop
(nShowCmd);
}

void CSimpleServiceModule::RunMessageLoop () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::RunMessageLoop ();
}

void CSimpleServiceModule::OnContinue () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::OnContinue ();
}

void CSimpleServiceModule::OnPause () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::OnPause ();
}

void CSimpleServiceModule::OnShutdown () throw()
{
    OnStop ();
}

void CSimpleServiceModule::OnStop () throw()
{
    CAtlServiceModuleT< CSimpleServiceModule, IDS_SERVICENAME >::OnStop ();
}

CSimpleServiceModule _AtlModule;


//
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, 
                                LPTSTR /*lpCmdLine*/, int nShowCmd)
{
    return _AtlModule.WinMain(nShowCmd);
}

    


Ответы

Ответ 1



Скорее всего у вас на второй машине не установлены рантаймы для C++. Если регистрировать сервис, как сказано в той статье через: SimpleService.exe -service То вы увидите соответствующую ошибку о том, что нет необходимых библиотек.

пятница, 13 марта 2020 г.

Что делать с файлом имяпроекта.v12.suo GIT

#c_sharp #visual_studio #git #visual_studio_2013 #git_commit


У меня есть проект, я его закомитил и создал новую ветку потом поработал в ней и
закомитил ещё раз чтоб вернуться в основную ветку. Потом вернулся в основную ветку,
в VS попросило нажать reload я жму, и потом пишу git status. Мне показывает что мой
файл имяпроекта.v12.suo modified. Тоже самое происходит когда я возвращаюсь обратно
в новую ветку, опять имяпроекта.v12.suo modified, тоесть чтоб переключаться между ветками
мне приходится дополнять коммит git commit --amend. Что с этим делать?
    


Ответы

Ответ 1



Добавьте *.suo в .gitignore. Файлы .suo содержат состояние открытых панелей Visual Studio и тому подобные вещи, интересные только на локальной машине. В репозитории им не место. Вот большой список того, что должно быть в .gitignore для проектов под Visual Studio: https://www.gitignore.io/api/visualstudio

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

Почему у функции scanf_s в Visual Studio при использовании “%s” прекращается работа в языке Си

#c #visual_cpp #visual_studio_2013


Почему у функции scanf_s в Visual Studio 2013 при использовании "%s" прекращается
работа в языке Си .

char name[40];
scanf_s("%s", name);


Тут, когда в консоли ввёл данные, нажимаю энтер, и вижу сообщение "Прекращение работы".
    


Ответы

Ответ 1



Потому что scanf_s требует указания размера всех передаваемых ей буферов. scanf_s("%s", name, 40);

Ответ 2



Надо указать параметр _countof (имя переменной куда считываешь), например: scanf_s("%s",&name,_countof(name));

пятница, 7 февраля 2020 г.

Qt; Не запускается программа из под IDE

#cpp #qt #visual_studio_2013


Создал новый проект Qt под MSVS-2013, при запуске отладчика выскакивает ошибка об
отсутствии Qt5Cored.dll. При всем при этом предыдущие проекты написанные ранее, запускаются
без проблем. Люто-бешено реквестирую помощь. 

P.S.: Перед запуском конвертировал проект в QMake и обратно в Add-in как и положено.

P.P.S: 28.05 Проблема так и не решена. Неужели никто не сталкивался с такой темой?
    


Ответы

Ответ 1



Деревянное решение - добавить путь к DLL Qt в PATH. Если вы используете Qt Visual Studio Add-in, то эту работу должен выполнять он. Причем он делает это неявно, буквально обрабатывает событие о старте отладки и стартуемому процессу добавляет путь к DLL в его копию PATH (кажется при обычном неотладочном старте он делает то же самое). Соответственно путь этот вы должны указать в настройках проекта Qt. Сделано это для того, чтобы можно было компилировать проекты под разные версии Qt. Так вот, помнится, я сталкивался с тем, что аддин в этом месте глючил и прописывал путь через раз. Нашел раз и два. Попробуйте, как по первой ссылке человек пишет, пересобрать аддин. Вообще, очень сложно судить почему ваша пограмма на вашей машине не находит DLL. Вы писали, что раньше работало, посмотрите что вы делали с системой в этот промежуток времени. И еще, в соотвествии с МСДН проверте все ли у вас настроено правильно.

Ответ 2



Проверьте настройки проекта. Скорей всего ошибка в линковщике (неправильно прописан или не прописан путь)

Ответ 3



Есть кривое, абсолютно корявое решение, но оно дает хоть что-то - таскать нужные dll в папке с проектом. Я понимаю что так не правильно, но другого решения не нашел.

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

VS 2013, отключение автоматического разворачивания методов

#visual_studio_2013


При копипасте иногда разворачиваются все методы, которые ниже места вставки кода.
Как отключить эту настройку? Т.е. чтобы при любой вставке кода в произвольное место
- методы оставались свернутыми.
    


Ответы

Ответ 1



Вся информация о сокрытии фрагментов кода, закладках и т.д. (так называемый outlining) хранится в файле *.suo, все пути в котором абсолютны. Естественно, при переносе проекта все абсолютные пути перестают быть актуальными и элементы outlining пропадают. Из файла *.suo можно понять, что он напрямую хранит структуры всех файлов с прямым указанием номеров строк к которым применяется тот или иной элемент outlining. Очевидно, при определенных условиях, при вставке фрагмента кода, номера строк в *.suo не пересчитываются, что и приводит к "падению" всего форматирования. Что это за "определенные условия", задуманы ли они разработчиками или являются банальным багом - вопрос отдельного исследования. P.S. Я прямо сейчас пробовал вставлять различные фрагменты кода разного размера и пришел к выводу, что outlining не пересчитывается, если вставляемый фрагмент содержит одну или более незакрытую скобку. Во всех остальных случаях VS2013(Английская) отработала верно и сохранила состояние outlining после вставленного фрагмента. P.S.S. Если проблема наблюдается и вы уверены, что со скобками все ОК, попробуйте перед вставкой крупного фрагмента кода делать файл .suo "только для чтения".

Ответ 2



Перенес ответ из комментария Никак. Это глюк. Глюки не настраиваются. Возможно, в VS 2015 починят. Это если вы пишете на дотнете, для двух языков которого вышел новый компилятор. В противном случае вряд ли. Но всё равно надейтесь на лучшее. А вдруг?

Ответ 3



Насколько я знаю, всё последующее разворачивается только если то, что вставлено не даёт корректную структуру. Например, если не скопирована закрывающая метод фигурная скобка. Хотя допускаю, что в вопросе речь идёт о какой-то другой ситуации.

Ответ 4



Отвечу немножко в сторону. Несколько странной выглядит эта зависимость от сворачивания методов. Могу допустить, что вашу проблему следует решить, изменив способ ориентирования в больших проектах. Например, для меня очень удачным оказался ReSharper с его функцией "Go to everything..." (Ctrl+N). Это во многих кейсах (но не во всех) избавляет от необходимости шарить по проекту и терпеть неудобства от развёрнутых методов.

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

Как отключить подчёркивание красными волнистыми линиями в Visual Studio для проектов QT?

#cpp #qt5 #qtcreator #visual_studio_2013


Создаю проект qt в Visual Studio.Проект полностью собирается и работает, но раздражают
подчёркивания намекающие на ошибки. Как от этого избавится? 

    


Ответы

Ответ 1



Это происходит из-за того, что IntelliSense не очень хорошо работает в студии и, судя по всему, в этом коде студия считает, что эти символы компилятору не известны. Я бы рекомендовал обновить студию, они постоянно улучшают эту часть. Если же хочется просто отключить подчёркивание, то Вы можете это сделать в Tools->Options->Text Editor->C/C++->Advanced->IntelliSense->Disable Squiggles

Ответ 2



Для того что бы решить эту проблему нужно в настройках проекта в верхнем выпадающем списке Конфигурации выбрать Все конфигурации. Дальше надо зайти в Свойства и конфигурации -> C/C++ и в пункте "Дополнительные каталоги включаем" вручную прописать пути к библиотеке QApplication которая, в моём случае, лежит по пути C:\Qt\Qt5.6.0\5.6\msvc2013_64\include\QtWidgets\5.6.0\QtWidgets. Кому лень читать, можно посмотреть видео. Но там другие пути прописываются, которые в моём случае, проблему не исправили.

Ответ 3



Tools -> Options -> Text Editor -> Font&Colors: find at down and select the "Error" at the "Color Scheme". Click "Copy", "Ok". Select No underline at the Underline section.

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

Расширение для Visual Studio 2013: добавление кнопки в стандартное (контекстное) меню

#visual_studio #visual_studio_2013 #visual_studio_extensions


Как добавить дополнительную кнопку в стандартное контекстное меню, которое появляется
при щелчке правой кнопкой мыши рядом с кодом?

Например такая функциональность: 


правый щелчок вызывает стандартное меню
в меню помимо стандартных есть новая кнопка
щелчок по ней вызывает действие (например появляется сообщение)

    


Ответы

Ответ 1



Ответ частично найден. Надо просто создать стандартный проект - Visual Stutio Package. Выбрать Menu Command в качестве интерфейса в диалоговом окне при создании (первый вариант). Потом открыть файл .vsct и поменять родителя у группы: Именно Привяжет группу (с кнопкой) в меню, появляющееся при нажатии правой кнопкой в коде. тут важен id этого меню IDM_VS_CTXT_CODEWIN и стандартный guid guidSHLMainMenu. Можно посмотреть другие id и guid (лучше в VS - там с описанием) https://msdn.microsoft.com/ru-ru/library/vstudio/microsoft.visualstudio.shell.vsmenus_members(v=vs.100).aspx#mainBody В обработчике можно написать что угодно и оно заработает private void MenuItemCallback(object sender, EventArgs e) { MessageBox.Show("Уже что-то заработало!!!"); }

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

Можно ли добавить библиотеку в exe? [дубликат]

#c_sharp #dll #visual_studio_2013


        
             
                
                    
                        
                            This question already has answers here:
                            
                        
                    
                
                        
                            Как скомпилировать все проекты солюшена в один .EXE?
                                
                                    (3 ответа)
                                
                        
                                Closed 2 года назад.
            
                    
Я написал небольшой проект в VS 2013, используя стороннюю библиотеку (DLL). Теперь
рядом с экзешником приходится постоянно держать эту библиотеку. Нельзя ли встроить
эту библиотеку в проект или хотя бы необходимую часть кода, что бы не приходилось повсюду
таскать эту dllку?
    


Ответы

Ответ 1



Да, можно. Зависимую библиотеку можно встроить в ресурсы и подгружать оттуда вручную. Предполагается, что ваша библиотека уже находится в References проекта, проект собирается, программа успешно запускается. Для начала добавьте в проект библиотеку как ресурс: Меню Project -> Add Existing Item... - выбираете вашу сборку (dll, в диалоге открытия выберите тип файлов Executable Files). Библиотека появится в списке файлов проекта. Вызовите контекстное меню на добавленном файле, выберите Properties. Затем установите в открывшемся окне Build Actions -> Embedded Resource. Добавьте в ваш проект следующий класс: public static class Resolver { private static volatile bool _loaded; public static void RegisterDependencyResolver() { if (!_loaded) { AppDomain.CurrentDomain.AssemblyResolve += OnResolve; _loaded = true; } } private static Assembly OnResolve(object sender, ResolveEventArgs args) { Assembly execAssembly = Assembly.GetExecutingAssembly(); string resourceName = String.Format("{0}.{1}.dll", execAssembly.GetName().Name, new AssemblyName(args.Name).Name); using (var stream = execAssembly.GetManifestResourceStream(resourceName)) { int read = 0, toRead = (int)stream.Length; byte[] data = new byte[toRead]; do { int n = stream.Read(data, read, data.Length - read); toRead -= n; read += n; } while (toRead > 0); return Assembly.Load(data); } } } Этот класс загрузит зависимую сборку из ресурса, как только основная программа обратится к ней, используя обработчик события AppDomain.AssemblyResolve. В классе, где находится точка входа программы, добавьте статический конструктор и вызовите метод RegisterDependencyResolver. Для примера, пусть у вас имеется консольное приложение: class Program { static Program() { Resolver.RegisterDependencyResolver(); } static void Main(string[] args) { // ... } } Заботиться о выгрузке сборки не надо, т.к. это все равно невозможно (можно выгрузить только домен целиком). Пример подсмотрен в книге Дж. Рихтера "CLR via C#".

Ответ 2



Еще один вариант - использовать ILMerge. Но писать скрипт для "склеивания" придется вручную, интеграции со студией из коробки нет. Также такой вариант будет работать не для любой библиотеки; если библиотека активно использует рефлексию - возможно потребуется написать свой обработчик AssemblyResolve: var assembly = typeof(Program).Assembly; AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => { if (args.Name == "имя внедренной сборки") return assembly; return null; }; Главное достоинство варианта с ILMerge при работе с несколькими проектами - не требуется помещать один и тот же код загрузчика в каждый проект; поскольку обработчик AssemblyResolve нужен только для рефлексии - можно поместить его в общую библиотеку.

Ответ 3



Используйте утилиту ILMerge, а точнее ILMergeGUI Отличная утилита, упаковывает все DLL в EXE

вторник, 26 ноября 2019 г.

Как мне улучшать свою программу без потери того что я уже сделал


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


Ответы

Ответ 1



Использовать TFS или Git. Применять для улучшений ветвление исходного кода Можно так же использовать и ваш метод с копированием, но это анахронизм.

Ответ 2



Вы можете сделать одну из простых вещей это организовать репозиторий у себя на локальном диске. Например под Windows удобная вещь как TortoiseSVN С помощью него в процессе написания кода вы можете постоянно сохранять промежуточные результаты. И в случае неудачи всегда можно откатиться на любую сохраненную версию. Также может использовать любой другой репозиторий. Популярны сейчас GIT и Mercurial.

Ответ 3



Данная задача давным-давно решена и её решение носит название "система контроля версий (или "система управления версиями"). Она позволяет сохранять снимки дерева исходнико проекта. В нужный момент программист указывает системе сделать снимок исходников (та называемый "коммит") и система сохраняет каким-либо образом в своём специальном каталоге данные, благодаря которым программист в любой момент времени сможет вернуться к этому коммиту. Можно возвращаться к любому коммиту, создавать новые ответвления, сливать ветки и т.п. Более подробную информацию можно получить из документации к конкретной системе. Примеры систем контроля версий: Git, SVN, Mercurial, Bazaar и т.д. P.S. Конечно, дело вкуса, но я бы порекомендовал Git.

Ответ 4



Много было сказано про систему контроля версий, но мало про: юнит тесты рефакторинг На всякий случай, скажу мое скромное понимание: Юнит тесты содержат код для проверки коректоности работы Ваших функций. После внесени изменений (рефакторинга) тесты менять не надо, они так же должны проходить (получать зачет). Рефакторинг - изменение кода малыми порциями, маленькими шажками, пока код не стане чистым, понятным. Между этими шажками хорошо запускать юнит-тесты, чтоб проверить, что при изменениях не было внесено ошибок. Юнит тесты в идеале должны быть подробными. Юнит тест одного метода должен покрыват все возможные варианты (ветки) прохождения по этому методу в зависимости от входных данных. Про это много написано в интернете. Хотя, во многих случаях (особенно, если имет ввиду малые пректы), игра не стоит свеч, то есть, не стоит того, чтобы замарачиваться с тестами и изучением подходов к рефакторингу. По просьбе, привожу простой пример юнит теста. Есть класс, который проверяет корректность формата телефонного номера public class PhoneValidator { public bool IsValid(string phone) { return UseSomeRegExToTestPhone(phone); } } Для этого класса надо сделать такой юнит тест, чтобы проверить все возможные категори входных строк. Как верные так и неверные. Но в примере напишу только две входные строки, т.к. все варианты - много... public void TestPhoneValidator() { string goodPhone = "+7 (910) 555 12 12"; string badPhone = "555 12" PhoneValidator validator = new PhoneValidator(); Assert.IsTrue(validator.IsValid(goodPhone)); Assert.IsFalse(validator.IsValid(badPhone)); //и т.д. } Assert - сама проверка. Значение слова Assert - утверждать. Если утверждение не верно, то кидается Exception и тест не проходит. Класс Assert - часть фреймворка тестирования. P.S. Для C# и Visual Studio можно закачать здоровскую нугетовскую (Nuget) библиотеку FluentAssertions, чтобы было удобно делать асёрты.

Ответ 5



Могу предложить использование бесплатной программы sourceTree (git). Она имеет удобны интерфейс на русском языке. По истечении месяца предлагается бесплатная регистрация. Можно хранить данные локально либо на удаленном репозитории (например github). При создании нового хранилища указывается корневая папка проекта (как вариант), эт значит что все что вложено в нее будет автоматически фиксироваться программой. Когд вы делаете изменения в файле (например улучшили ваш код), программа автоматически показывает изменения и предлагает их зафиксировать и прокомментировать, естественно к каждому изменению можно будет вернуться в любой момент времени. для поиска просто вбейте в гугл atlassian sourcetree.

воскресенье, 2 июня 2019 г.

Что делать с файлом имяпроекта.v12.suo GIT

У меня есть проект, я его закомитил и создал новую ветку потом поработал в ней и закомитил ещё раз чтоб вернуться в основную ветку. Потом вернулся в основную ветку, в VS попросило нажать reload я жму, и потом пишу git status. Мне показывает что мой файл имяпроекта.v12.suo modified. Тоже самое происходит когда я возвращаюсь обратно в новую ветку, опять имяпроекта.v12.suo modified, тоесть чтоб переключаться между ветками мне приходится дополнять коммит git commit --amend. Что с этим делать?


Ответ

Добавьте *.suo в .gitignore
Файлы .suo содержат состояние открытых панелей Visual Studio и тому подобные вещи, интересные только на локальной машине. В репозитории им не место.

Вот большой список того, что должно быть в .gitignore для проектов под Visual Studio: https://www.gitignore.io/api/visualstudio

понедельник, 13 мая 2019 г.

Почему у функции scanf_s в Visual Studio при использовании “%s” прекращается работа в языке Си

Почему у функции scanf_s в Visual Studio 2013 при использовании "%s" прекращается работа в языке Си .
char name[40]; scanf_s("%s", name);
Тут, когда в консоли ввёл данные, нажимаю энтер, и вижу сообщение "Прекращение работы".


Ответ

Потому что scanf_s требует указания размера всех передаваемых ей буферов.
scanf_s("%s", name, 40);

пятница, 11 января 2019 г.

Как отключить подчёркивание красными волнистыми линиями в Visual Studio для проектов QT?

Создаю проект qt в Visual Studio.Проект полностью собирается и работает, но раздражают подчёркивания намекающие на ошибки. Как от этого избавится?


Ответ

Для того что бы решить эту проблему нужно в настройках проекта в верхнем выпадающем списке Конфигурации выбрать Все конфигурации. Дальше надо зайти в Свойства и конфигурации -> C/C++ и в пункте "Дополнительные каталоги включаем" вручную прописать пути к библиотеке QApplication которая, в моём случае, лежит по пути C:\Qt\Qt5.6.0\5.6\msvc2013_64\include\QtWidgets\5.6.0\QtWidgets.
Кому лень читать, можно посмотреть видео. Но там другие пути прописываются, которые в моём случае, проблему не исправили.

пятница, 26 октября 2018 г.

Расширение для Visual Studio 2013: добавление кнопки в стандартное (контекстное) меню

Как добавить дополнительную кнопку в стандартное контекстное меню, которое появляется при щелчке правой кнопкой мыши рядом с кодом?
Например такая функциональность:
правый щелчок вызывает стандартное меню в меню помимо стандартных есть новая кнопка щелчок по ней вызывает действие (например появляется сообщение)


Ответ

Ответ частично найден.
Надо просто создать стандартный проект - Visual Stutio Package. Выбрать Menu Command в качестве интерфейса в диалоговом окне при создании (первый вариант). Потом открыть файл .vsct и поменять родителя у группы:

Именно

Привяжет группу (с кнопкой) в меню, появляющееся при нажатии правой кнопкой в коде. тут важен id этого меню IDM_VS_CTXT_CODEWIN и стандартный guid guidSHLMainMenu. Можно посмотреть другие id и guid (лучше в VS - там с описанием) https://msdn.microsoft.com/ru-ru/library/vstudio/microsoft.visualstudio.shell.vsmenus_members(v=vs.100).aspx#mainBody
В обработчике можно написать что угодно и оно заработает
private void MenuItemCallback(object sender, EventArgs e) { MessageBox.Show("Уже что-то заработало!!!"); }

четверг, 11 октября 2018 г.

Можно ли добавить библиотеку в exe? [дубликат]

На данный вопрос уже ответили: Как скомпилировать все проекты солюшена в один .EXE? 3 ответа Я написал небольшой проект в VS 2013, используя стороннюю библиотеку (DLL). Теперь рядом с экзешником приходится постоянно держать эту библиотеку. Нельзя ли встроить эту библиотеку в проект или хотя бы необходимую часть кода, что бы не приходилось повсюду таскать эту dllку?


Ответ

Да, можно. Зависимую библиотеку можно встроить в ресурсы и подгружать оттуда вручную. Предполагается, что ваша библиотека уже находится в References проекта, проект собирается, программа успешно запускается.
Для начала добавьте в проект библиотеку как ресурс:
Меню Project -> Add Existing Item... - выбираете вашу сборку (dll, в диалоге открытия выберите тип файлов Executable Files). Библиотека появится в списке файлов проекта. Вызовите контекстное меню на добавленном файле, выберите Properties. Затем установите в открывшемся окне Build Actions -> Embedded Resource.
Добавьте в ваш проект следующий класс:
public static class Resolver { private static volatile bool _loaded;
public static void RegisterDependencyResolver() { if (!_loaded) { AppDomain.CurrentDomain.AssemblyResolve += OnResolve; _loaded = true; } }
private static Assembly OnResolve(object sender, ResolveEventArgs args) { Assembly execAssembly = Assembly.GetExecutingAssembly(); string resourceName = String.Format("{0}.{1}.dll", execAssembly.GetName().Name, new AssemblyName(args.Name).Name);
using (var stream = execAssembly.GetManifestResourceStream(resourceName)) { int read = 0, toRead = (int)stream.Length; byte[] data = new byte[toRead];
do { int n = stream.Read(data, read, data.Length - read); toRead -= n; read += n; } while (toRead > 0);
return Assembly.Load(data); } } }
Этот класс загрузит зависимую сборку из ресурса, как только основная программа обратится к ней, используя обработчик события AppDomain.AssemblyResolve
В классе, где находится точка входа программы, добавьте статический конструктор и вызовите метод RegisterDependencyResolver. Для примера, пусть у вас имеется консольное приложение:
class Program { static Program() { Resolver.RegisterDependencyResolver(); }
static void Main(string[] args) { // ... } }
Заботиться о выгрузке сборки не надо, т.к. это все равно невозможно (можно выгрузить только домен целиком).
Пример подсмотрен в книге Дж. Рихтера "CLR via C#".

вторник, 2 октября 2018 г.

Как мне улучшать свою программу без потери того что я уже сделал

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


Ответ

Использовать TFS или Git. Применять для улучшений ветвление исходного кода Можно так же использовать и ваш метод с копированием, но это анахронизм.