Nano Hash - криптовалюты, майнинг, программирование

Невозможно перезаписать файлы .dll Visual Studio 2008, доступ запрещен

Это странно. Visual Studio 2008, похоже, не освобождает свой дескриптор для создаваемых .DLL для моего проекта, поэтому во второй раз (и в последующие разы) я создаю, когда Studio пытается перезаписать измененные .dll, она получает ошибку отказа в доступе. Я также не могу скопировать / удалить рассматриваемый .dll (Tasks.dll), пока Visual Studio открыта после того, как я один раз собрал. Process Explorer сообщает мне, что файл используется devenv.exe, поэтому я знаю, что Visual Studio не отпускает его после завершения сборки.

Кто-нибудь видел это раньше, и если да, что я могу с этим поделать? Очевидно, что открытие и закрытие Visual Studio между каждой сборкой не является приемлемым решением, и проблема сохраняется после перезапуска системы.

Еще немного предыстории: я использую DLL проекта, вызывающего ошибку (Tasks.dll), в директиве UsingTask MSBuild в другом проекте, назовем его Test. Порядок сборки проекта устанавливается таким образом, что задачи создаются перед тестом, а затем задача AfterBuild в тесте вызывает задачу из /bin/debug/Tasks.dll.

03.05.2010

  • Вы ссылаетесь на другие проекты как на проекты или напрямую ссылаетесь на их DLL из их \ bin? 04.05.2010
  • Вы добавили каталог bin в систему управления версиями и заблокировали их? 04.05.2010
  • Проект не находится под контролем источника, поэтому, по крайней мере, нет проблем ... отредактировано для решения другого вопроса 04.05.2010
  • Вы устали чистить раствор. тогда строительство? 04.05.2010
  • Вы выполняете отладку между сборками, и если да, то есть ли у вас служба WCF, которая заставляет фоновый файл WcfSvcHost.exe запускаться и удерживать дескриптор библиотеки DLL? 04.05.2010
  • Ага, как и ребилд - без кубиков. Я также вручную удалил библиотеки DLL, пока Visual Studio закрыта, но это решает проблему только для первой новой сборки - после этого она снова получает доступ. 04.05.2010
  • Я не занимаюсь отладкой между сборками, по крайней мере, с тех пор, как возникла эта проблема. Обозреватель процессов утверждает, что единственный процесс с дескриптором Tasks.dll - это devenv.exe. 04.05.2010
  • Кто-нибудь решил это? Я столкнулся с той же проблемой в Visual Studio 2010. Кстати, очистка решения не помогает. 20.12.2010

Ответы:


1

Конечно. У нас была такая же проблема. Я не могу сказать, когда именно возникает проблема и какие условия должны ее воспроизвести, но в нашей ситуации это произошло в проекте, в котором у нас было несколько модулей, и каждый модуль ссылался на несколько других модулей, а упомянутые модули также имели ссылки на другие модули и т. Д.

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

Мы не могли провести рефакторинг проекта для упрощения ссылок (слишком дорого), мы не могли также тратить больше времени на исследование проблемы, поэтому мы нашли обходной путь - не идеальный, но он помог нам, и мы используем его в течение многих лет в этом проекте. Это немного сложно, но я постараюсь описать это:

  1. Прежде всего - пример структуры проекта
    - MyProject (dir)
    - Bin (dir)
    * Proj1.exe
    * Proj2.dll
    * Proj3.dll
    - Src ( dir)
    - Proj1 (dir)
    - Proj2 (dir)
    - bin (dir)
    - Proj3 (dir)
    - bin (dir)

  2. Proj1 (который, предположим, является приложением консоли / Windows - * .exe) имеет выходной каталог, установленный на MyProject / Bin

  3. Proj2 (.dll) имеет вывод сборки, установленный по умолчанию на MyProject / Src / Proj2 / bin / ... в событии postbuild, мы копируем результат в "MyProject / Bin"

    copy "$ (TargetDir) \ $ (TargetName) .dll" "$ (SolutionDir) Bin"
    copy "$ (TargetDir) \ $ (TargetName) .pdb" "$ (SolutionDir) Корзина "

  4. Proj3 (.dll) имеет вывод сборки, установленный по умолчанию в MyProject / Src / Proj3 / bin / ... postbuild такой же, как и для Proj2

  5. А теперь ссылки. Допустим, Proj1 нужна ссылка на Proj2, а Proj2 нужна ссылка на Proj3.

    • for the first time build only Proj3, so that in the result of postbuild event commands it will be copied to MyProject/Bin
    • теперь в Proj2 добавить ссылку на сборку MyProject / Bin / Proj3.dll (перейти к файлу сборки, не ссылаться на проект). В зависимостях проекта вручную укажите, что для этого проекта требуется сначала собрать Proj3. После этого соберите "Proj2", чтобы он был скопирован в MyProject / Bin (команды события postbuild)
    • и, наконец, в Proj1 добавьте ссылку на сборку MyProject / Bin / Proj2.dll (снова перейдите к сборке). В зависимостях проекта вручную укажите, что для этого проекта требуется Proj2 для сборки первых файлов. И теперь вы можете построить все решение.

Основные проблемы с вышеуказанным подходом:

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

2

Самое простое, что вы можете сделать в этой ситуации, - использовать команду taskkill, чтобы убить процесс Visual Studio и все его дочерние процессы.

Вы можете вызвать это из командной строки или из PowerShell.

taskkill -IM devenv.exe /F /T

Два аргумента предназначены для /Force, а /T также убивает дочерние процессы.

ПРИМЕЧАНИЕ: введите taskkill -? в командной строке для получения дополнительной информации.

21.06.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..