Сборка неверно указана как файл
Как убрать предупреждение "Сборка My.dll неверно указана как файл"? (c#, visual-studio, visual-studio-2017) / husl.ru
<Content Include="dll\My.dll" />
Эта строчка говорит о том, что этому файлу в свойстве Build Action
указано Content
. Описание ошибки в MSDN никак не связано с значением BuildAction=Content которое я нашел в этом ответе.
Описание ошибки
MSB3178: Assembly '' is incorrectly specified as a file.
This warning is generated during application manifest generation when the build process detects that a file reference is actually a (managed or native) assembly.
Это предупреждение выдается если в процессе сборки обнаружена ссылка на файл который на самом деле является управляемой сборкой или нативной библиотекой.
Описание значения Build Action=Content
Content: Allows you to retrieve a file (in the same directory as the assembly) as a stream via
Application.GetContentStream(URI)
. For this method to work, it needs aAssemblyAssociatedContentFile
custom attribute which Visual Studio graciously adds when you mark a file as "Content"
Добавляет возможность получить содержимое файла в виде потока с помощью метода Application.GetContentStream(URI)
. Файл должен быть помещен в той же папке что и текущая сборка.
Тем не менее, здесь можно найти ответ, который рекомендует для решения аналогичной проблемы изменить Build Action
на None
. Это не принятый ответ, но у него самое большое количество плюсов.
Я не сумел воспроизвести аналогичную ошибку и проверить ответ. Но нашел подтвержение ему в этом блоге.
This time I tried something else, this time I set the build action to none and copy if newer for each of the dll’s generating this warning.
It seems to have gotten rid of the warnings plus the program still compiles and runs (with complete directory clean).
На этот раз я попробовал кое-что еще. Я установил build action в none и задал опцию copy if newer для каждой dll, которая выдавала это предупреждение.
Кажется, это помогло избавиться от предупреждений, плюс программу можно было скомпилировать и запустить.
Поэтому я советую попробовать установить свойство Build Action=None
. Скорее всего это поможет решить проблему.
Так как у меня нет локализованного интерфейса студии, прикладываю скриншот, на тот случай если будущим читателям будет необходима подсказка - как найти это свойство в студии. Нужно выделить файл в Solution Explorer (Обозреватель решений), и тогда его свойства станут доступны в этом окне.
Полное руководство по CMake. Часть вторая: Система сборки / Хабр
В данной статье рассмотрено использование системы сборки CMake, применяемой в колоссальном количестве проектов на C/C++. Строго рекомендуется прочитать первую часть руководства во избежание непонимания синтаксиса языка CMake, явным образом фигурирующего на протяжении всей статьи.
Ниже приведены примеры использования языка CMake, по которым Вам следует попрактиковаться. Экспериментируйте с исходным кодом, меняя существующие команды и добавляя новые. Чтобы запустить данные примеры, установите CMake с официального сайта.
Система сборки CMake представляет из себя оболочку над другими платформенно зависимыми утилитами (например, Ninja или Make). Таким образом, в самом процессе сборки, как бы парадоксально это ни звучало, она непосредственного участия не принимает.
Система сборки CMake принимает на вход файл CMakeLists.txt
с описанием правил сборки на формальном языке CMake, а затем генерирует промежуточные и нативные файлы сборки в том же каталоге, принятых на Вашей платформе.
Сгенерированные файлы будут содержать конкретные названия системных утилит, директорий и компиляторов, в то время как команды CMake орудуют лишь абстрактным понятием компилятора и не привязаны к платформенно зависимым инструментам, сильно различающихся на разных операционных системах.
Команда cmake_minimum_required
проверяет запущенную версию CMake: если она меньше указанного минимума, то CMake завершает свою работу фатальной ошибкой. Пример, демонстрирующий типичное использование данной команды в начале любого CMake-файла:
# Задать третью минимальную версию CMake: cmake_minimum_required(VERSION 3.0)
Как подметили в комментариях, команда cmake_minimum_required
выставляет все флаги совместимости (смотреть cmake_policy
). Некоторые разработчики намеренно выставляют низкую версию CMake, а затем корректируют функционал вручную. Это позволяет одновременно поддерживать древние версии CMake и местами использовать новые возможности.
В начале любого CMakeLists.txt
следует задать характеристики проекта командой project
для лучшего оформления интегрированными средами и прочими инструментами разработки.
# Задать характеристики проекта "MyProject": project(MyProject VERSION 1.2.3.4 LANGUAGES C CXX)
Стоит отметить, что если ключевое слово LANGUAGES
опущено, то по умолчанию задаются языки C CXX
. Вы также можете отключить указание любых языков путём написания ключевого слова NONE
в качестве списка языков или просто оставить пустой список.
Команда include
заменяет строку своего вызова кодом заданного файла, действуя аналогично препроцессорной команде include
языков C/C++. Этот пример запускает скриптовый файл MyCMakeScript.cmake
описанной командой:
message("'TEST_VARIABLE' is equal to [${TEST_VARIABLE}]") # Запустить скрипт `MyCMakeScript.cmake` на выполнение: include(MyCMakeScript.cmake) message("'TEST_VARIABLE' is equal to [${TEST_VARIABLE}]")
В данном примере, первое сообщение уведомит о том, что переменная TEST_VARIABLE
ещё не определена, однако если скрипт MyCMakeScript.cmake
определит данную переменную, то второе сообщение уже будет информировать о новом значении тестовой переменной. Таким образом, скриптовый файл, включаемый командой include
, не создаёт собственной области видимости, о чём упомянули в комментариях к предыдущей статье.
Команда add_executable
компилирует исполняемый файл с заданным именем из списка исходников. Важно отметить, что окончательное имя файла зависит от целевой платформы (например, <ExecutableName>.exe
или просто <ExecutableName>
). Типичный пример вызова данной команды:
# Скомпилировать исполняемый файл "MyExecutable" из # исходников "ObjectHandler.c", "TimeManager.c" и "MessageGenerator.c": add_executable(MyExecutable ObjectHandler.c TimeManager.c MessageGenerator.c)
Команда add_library
компилирует библиотеку с указанным видом и именем из исходников. Важно отметить, что окончательное имя библиотеки зависит от целевой платформы (например, lib<LibraryName>.a
или <LibraryName>.lib
). Типичный пример вызова данной команды:
# Скомпилировать статическую библиотеку "MyLibrary" из # исходников "ObjectHandler.c", "TimeManager.c" и "MessageConsumer.c": add_library(MyLibrary STATIC ObjectHandler.c TimeManager.c MessageConsumer.c)
- Статические библиотеки задаются ключевым словом
STATIC
вторым аргументом и представляют из себя архивы объектных файлов, связываемых с исполняемыми файлами и другими библиотеками во время компиляции; - Динамические библиотеки задаются ключевым словом
SHARED
вторым аргументом и представляют из себя двоичные библиотеки, загружаемые операционной системой во время выполнения программы; - Модульные библиотеки задаются ключевым словом
MODULE
вторым аргументом и представляют из себя двоичные библиотеки, загружаемые посредством техник выполнения самим исполняемым файлом; - Объектные библиотеки задаются ключевым словом
OBJECT
вторым аргументом и представляют из себя набор объектных файлов, связываемых с исполняемыми файлами и другими библиотеками во время компиляции.
Бывают случаи, требующие многократного добавления исходных файлов к цели. Для этого предусмотрена команда target_sources
, способная добавлять исходники к цели множество раз.
Первым аргументом команда target_sources
принимает название цели, ранее указанной с помощью команд add_library
или add_executable
, а последующие аргументы являются списком добавляемых исходных файлов.
Повторяющиеся вызовы команды target_sources
добавляют исходные файлы к цели в том порядке, в каком они были вызваны, поэтому нижние два блока кода являются функционально эквивалентными:
# Задать исполняемый файл "MyExecutable" из исходников # "ObjectPrinter.c" и "SystemEvaluator.c": add_executable(MyExecutable ObjectPrinter.c SystemEvaluator.c) # Добавить к цели "MyExecutable" исходник "MessageConsumer.c": target_sources(MyExecutable MessageConsumer.c) # Добавить к цели "MyExecutable" исходник "ResultHandler.c": target_sources(MyExecutable ResultHandler.c)
# Задать исполняемый файл "MyExecutable" из исходников # "ObjectPrinter.c", "SystemEvaluator.c", "MessageConsumer.c" и "ResultHandler.c": add_executable(MyExecutable ObjectPrinter.c SystemEvaluator.c MessageConsumer.c ResultHandler.c)
Местоположение выходных файлов, сгенерированных командами add_executable
и add_library
, определяется только на стадии генерации, однако данное правило можно изменить несколькими переменными, определяющими конечное местоположение двоичных файлов:
Исполняемые файлы всегда рассматриваются целями выполнения, статические библиотеки — архивными целями, а модульные библиотеки — библиотечными целями. Для "не-DLL" платформ динамические библиотеки рассматриваются библиотечными целями, а для "DLL-платформ" — целями выполнения. Для объектных библиотек таких переменных не предусмотрено, поскольку такой вид библиотек генерируется в недрах каталога CMakeFiles
.
Важно подметить, что "DLL-платформами" считаются все платформы, основанные на Windows, в том числе и Cygwin.
Команда target_link_libraries
компонует библиотеку или исполняемый файл с другими предоставляемыми библиотеками. Первым аргументом данная команда принимает название цели, сгенерированной с помощью команд add_executable
или add_library
, а последующие аргументы представляют собой названия целей библиотек или полные пути к библиотекам. Пример:
# Скомпоновать исполняемый файл "MyExecutable" с # библиотеками "JsonParser", "SocketFactory" и "BrowserInvoker": target_link_libraries(MyExecutable JsonParser SocketFactory BrowserInvoker)
Стоит отметить, что модульные библиотеки не подлежат компоновке с исполняемыми файлами или другими библиотеками, так как они предназначены исключительно для загрузки техниками выполнения.
Как упомянули в комментариях, цели в CMake тоже подвержены ручному манипулированию, однако весьма ограниченному.
Имеется возможность управления свойствами целей, предназначенных для задания процесса сборки проекта. Команда get_target_property
присваивает предоставленной переменной значение свойства цели. Данный пример выводит значение свойства C_STANDARD
цели MyTarget
на экран:
# Присвоить переменной "VALUE" значение свойства "C_STANDARD": get_target_property(VALUE MyTarget C_STANDARD) # Вывести значение полученного свойства на экран: message("'C_STANDARD' property is equal to [${VALUE}]")
Команда set_target_properties
устанавливает указанные свойства целей заданными значениями. Данная команда принимает список целей, для которых будут установлены значения свойств, а затем ключевое слово PROPERTIES
, после которого следует список вида <название свойства> <новое значение>
:
# Установить свойству 'C_STANDARD' значение "11", # а свойству 'C_STANDARD_REQUIRED' значение "ON": set_target_properties(MyTarget PROPERTIES C_STANDARD 11 C_STANDARD_REQUIRED ON)
Пример выше задал цели MyTarget
свойства, влияющие на процесс компиляции, а именно: при компиляции цели MyTarget
CMake затребует компилятора о использовании стандарта C11. Все известные именования свойств целей перечисляются на этой странице.
Также имеется возможность проверки ранее определённых целей с помощью конструкции if(TARGET <TargetName>)
:
# Выведет "The target was defined!" если цель "MyTarget" уже определена, # а иначе выведет "The target was not defined!": if(TARGET MyTarget) message("The target was defined!") else() message("The target was not defined!") endif()
Команда add_subdirectory
побуждает CMake к незамедлительной обработке указанного файла подпроекта. Пример ниже демонстрирует применение описанного механизма:
# Добавить каталог "subLibrary" в сборку основного проекта, # а генерируемые файлы расположить в каталоге "subLibrary/build": add_subdirectory(subLibrary subLibrary/build)
В данном примере первым аргументом команды add_subdirectory
выступает подпроект subLibrary
, а второй аргумент необязателен и информирует CMake о папке, предназначенной для генерируемых файлов включаемого подпроекта (например, CMakeCache.txt
и cmake_install.cmake
).
Стоит отметить, что все переменные из родительской области видимости унаследуются добавленным каталогом, а все переменные, определённые и переопределённые в данном каталоге, будут видимы лишь ему (если ключевое слово PARENT_SCOPE
не было определено аргументом команды set
). Данную особенность упомянули в комментариях к предыдущей статье.
Команда find_package
находит и загружает настройки внешнего проекта. В большинстве случаев она применяется для последующей линковки внешних библиотек, таких как Boost и GSL. Данный пример вызывает описанную команду для поиска библиотеки GSL и последующей линковки:
# Загрузить настройки пакета библиотеки "GSL": find_package(GSL 2.5 REQUIRED) # Скомпоновать исполняемый файл с библиотекой "GSL": target_link_libraries(MyExecutable GSL::gsl) # Уведомить компилятор о каталоге заголовков "GSL": target_include_directories(MyExecutable ${GSL_INCLUDE_DIRS})
В приведённом выше примере команда find_package
первым аргументом принимает наименование пакета, а затем требуемую версию. Опция REQUIRED
требует печати фатальной ошибки и завершении работы CMake, если требуемый пакет не найден. Противоположность — это опция QUIET
, требующая CMake продолжать свою работу, даже если пакет не был найден.
Далее исполняемый файл MyExecutable
линкуется с библиотекой GSL командой target_link_libraries
с помощью переменной GSL::gsl
, инкапсулирующей расположение уже скомпилированной GSL.
В конце вызывается команда target_include_directories
, информирующая компилятора о расположении заголовочных файлов библиотеки GSL. Обратите внимание на то, что используется переменная GSL_INCLUDE_DIRS
, хранящая местоположение описанных мною заголовков (это пример импортированных настроек пакета).
Вам, вероятно, захочеться проверить результат поиска пакета, если Вы указали опцию QUIET
. Это можно сделать путём проверки переменной <PackageName>_FOUND
, автоматически определяемой после завершения команды find_package
. Например, в случае успешного импортирования настроек GSL в Ваш проект, переменная GSL_FOUND
обратится в истину.
В общем случае, команда find_package
имеет две разновидности запуска: модульную и конфигурационную. Пример выше применял модульную форму. Это означает, что во время вызова команды CMake ищет скриптовый файл вида Find<PackageName>.cmake
в директории CMAKE_MODULE_PATH
, а затем запускает его и импортирует все необходимые настройки (в данном случае CMake запустила стандартный файл FindGSL.cmake
).
Информировать компилятора о располжении включаемых заголовков можно посредством двух команд: include_directories
и target_include_directories
. Вы решаете, какую из них использовать, однако стоит учесть некоторые различия между ними (идея предложена в комментариях).
Команда include_directories
влияет на область каталога. Это означает, что все директории заголовков, указанные данной командой, будут применяться для всех целей текущего CMakeLists.txt
, а также для обрабатываемых подпроектов (смотреть add_subdirectory
).
Команда target_include_directories
влияет лишь на указанную первым аргументом цель, а на другие цели никакого воздействия не оказывается. Пример ниже демонстрирует разницу между этими двумя командами:
add_executable(RequestGenerator RequestGenerator.c) add_executable(ResponseGenerator ResponseGenerator.c) # Применяется лишь для цели "RequestGenerator": target_include_directories(RequestGenerator headers/specific) # Применяется для целей "RequestGenerator" и "ResponseGenerator": include_directories(headers)
В комментариях упомянуто, что в современных проектах применение команд include_directories
и link_libraries
является нежелательным. Альтернатива — это команды target_include_directories
и target_link_libraries
, действующие лишь на конкретные цели, а не на всю текущую область видимости.
Команда install
генерирует установочные правила для Вашего проекта. Данная команда способна работать с целями, файлами, папками и многим другим. Сперва рассмотрим установку целей.
Для установки целей необходимо первым аргументом описанной функции передать ключевое слово TARGETS
, за которым должен следовать список устанавливаемых целей, а затем ключевое слово DESTINATION
с расположением каталога, в который установятся указанные цели. Данный пример демонстрирует типичную установку целей:
# Установить цели "TimePrinter" и "DataScanner" в директорию "bin": install(TARGETS TimePrinter DataScanner DESTINATION bin)
Процесс описания установки файлов аналогичен, за тем исключением, что вместо ключевого слова TARGETS
следует указать FILES
. Пример, демонстрирующий установку файлов:
# Установить файлы "DataCache.txt" и "MessageLog.txt" в директорию "~/": install(FILES DataCache.txt MessageLog.txt DESTINATION ~/)
Процесс описания установки папок аналогичен, за тем исключением, что вместо ключевого слова FILES
следует указать DIRECTORY
. Важно подметить, что при установке будет копироваться всё содержимое папки, а не только её название. Пример установки папок выглядит следующим образом:
# Установить каталоги "MessageCollection" и "CoreFiles" в директорию "~/": install(DIRECTORY MessageCollection CoreFiles DESTINATION ~/)
После завершения обработки CMake всех Ваших файлов Вы можете выполнить установку всех описанных объектов командой sudo checkinstall
(если CMake генерирует Makefile
), или же выполнить данное действие интегрированной средой разработки, поддерживающей CMake.
Данное руководство было бы неполным без демонстрации реального примера использования системы сборки CMake. Рассмотрим схему простого проекта, использующего CMake в качестве единственной системы сборки:
+ MyProject - CMakeLists.txt - Defines.h - StartProgram.c + core - CMakeLists.txt - Core.h - ProcessInvoker.c - SystemManager.c
Главный файл сборки CMakeLists.txt
описывает компиляцию всей программы: сперва происходит вызов команды add_executable
, компилирующей исполняемый файл, затем вызывается команда add_subdirectory
, побуждающая обработку подпроекта, и наконец, исполняемый файл линкуется с собранной библиотекой:
# Задать минимальную версию CMake: cmake_minimum_required(VERSION 3.0) # Указать характеристики проекта: project(MyProgram VERSION 1.0.0 LANGUAGES C) # Добавить в сборку исполняемый файл "MyProgram": add_executable(MyProgram StartProgram.c) # Требовать обработку файла "core/CMakeFiles.txt": add_subdirectory(core) # Скомпоновать исполняемый файл "MyProgram" со # скомпилированной статической библиотекой "MyProgramCore": target_link_libraries(MyProgram MyProgramCore) # Установить исполняемый файл "MyProgram" в директорию "bin": install(TARGETS MyProgram DESTINATION bin)
Файл core/CMakeLists.txt
вызывается главным файлом сборки и компилирует статическую библиотеку MyProgramCore
, предназначенную для линковки с исполняемым файлом:
# Задать минимальную версию CMake: cmake_minimum_required(VERSION 3.0) # Добавить в сборку статическую библиотеку "MyProgramCore": add_library(MyProgramCore STATIC ProcessInvoker.c SystemManager.c)
После череды команд cmake . && make && sudo checkinstall
работа системы сборки CMake завершается успешно. Первая команда запускает обработку файла CMakeLists.txt
в корневом каталоге проекта, вторая команда окончательно компилирует необходимые двоичные файлы, а третья команда устанавливает скомпонованный исполняемый файл MyProgram
в систему.
Теперь Вы способны писать свои и понимать чужие CMake-файлы, а подробно прочитать про остальные механизмы Вы можете на официальном сайте.
Следующая статья данного руководства будет посвящена тестированию и созданию пакетов с помощью CMake и выйдет через неделю. До скорых встреч!
14 причин, почему CodeBlocks не работает
Я постоянно получаю письма о том, что CodeBlocks ведет себя как-то не так. В этой статьей рассмотрим самые популярные причины, почему CodeBlocks может неверно себя вести.
1. Не хватает нужных компонентов (компилятора, отладчика, библиотек)
Нужно понимать, что CodeBlocks — это просто каркас для подключения различных инструментов. Если вы просто скачаете пустой CodeBlocks с официального сайта и попытаетесь писать и отлаживать программу, то у вас ничего не получится. CodeBlocks не сможет запустить ни комплятор, ни отладчик. Все это нужно скачивать и устанавливать отдельно.
Но тут будет новая проблема — проблема выбора. CodeBlocks поддерживает все существующие компиляторы Си, какой выбрать? То же относится к любому другому инструментарию: отладчикам, профайлерам, плагинам и т.д.
Именно поэтому я и сделал сборку Си-экспресс, чтобы можно было сразу распаковать и работать. Все нужные компоненты уже установлены. Если вы точно знаете, что вам нужен другой компонент, то просто найдите и замените его на тот, который вам нужен.
Решение: Скачайте сборку Си-экспресс.
2. Неверно указаны пути к компонентам
Эта ошибка может возникать, когда вы все скачали и установили, но неверно прописали пути. Поэтому CodeBlocks не может эти компоненты найти.
В случае с компилятором вопрос решается просто. Удалите настройки и запустите CodeBlocks. При первом запуске CodeBlocks просканирует ваш диск на наличие компилятора и выдает список всех найденных компиляторов.
Вам остается только сделать выбор и можно работать.
Но для других компонентов это не так, поэтому нужно проверить, что все они прописаны. Для этого зайдите в меню «Настройки — Compiler… — Программы»
Убедитесь, что все компоненты присутствуют на вашем компьютере.
Решение: Нужные программы должны быть или в папке «bin» каталога установки компилятора, или укажите дополнительные пути для их вызова.
3. Символы кириллицы или пробелы в пути к программе CodeBlocks
Есть старая проблема с тем, что инструменты программиста часто имеют проблемы с кодировками. Считается, что программист настолько крут, что сможет эту проблему решить самостоятельно. Но для новичков в программировании это оказывается непреодолимым препятствием. Новички часто устанавливают CodeBlocks:
- или в «c:\Program Files (x86)\CodeBlocks»
- или в папку типа «c:\Я начинаю изучать программирование\CodeBlocks»
В обоих случаях программа будет работать неверно, так как какой-то из компонентов откажется выполняться.
Например в документации на компилятор MinGW говорится:
У MinGW могут быть проблемы с путями, содержащими пробелы, а если нет, обычно другие программы, используемые с MinGW, будут испытывать проблемы с такими путями. Таким образом, мы настоятельно рекомендуем не устанавливать MinGW в любом месте с пробелами в имени пути ссылки . Вам следует избегать установки в любой каталог или подкаталог с именами, такими как «Program Files» или «Мои документы».
Решение: Установите CodeBlocks в папку «C:\Prog\CodeBlocks» или в любую другую папку, в пути к которой нет пробелов или кириллицы.
4. Символы кириллицы или пробелы в пути к разрабатываемой программе
Это следствие той же проблемы, что и в предыдущем случае. Программист нормально установил среду программирования, все работает, но вдруг какая-то новая программа отказывается компилироваться. Обычно описание ошибки выглядит как: «No such file or directory» при этом имя файла отображается в нечитаемой кодировке.
Как правило, причина в том, что путь к проекту содержит символы кириллицы или пробелы. Например проект был размещен в каталоге с именем типа: «c:\Новая папка».
Решение: Создавайте проекты в папке «c:\Work» или в любой другой папке, в пути к которой нет пробелов или кириллицы.
5. Не все пункты меню активны
Вы запустили CodeBlocks, но при этом некоторые пункты меню не активны. Например, иконки для отладки:
Это происходит в том случае, если вы связали расширение «.c» с вызовом CodeBlocks. В этом случае среда работает как редактор исходного текста. Чтобы активировать все функции среды нужно открыть проект.
Решение: Сначала запустите CodeBlocks, а затем откройте проект. Проект имеет расширение «.cbp».
6. При запуске компилятора ничего не происходит
Это следствие той же проблемы, что и в пункте 5. CodeBlocks запущен в режиме простого редактирования, поэтому не все функции работают. Для включения всех функций вы должны работать с проектом.
Решение: Откройте проект или создайте новый.
7. Программа работает из CodeBlocks, но если запустить ее отдельно, то она сразу закрывается
Это нормальная работа консольной программы. Если ее запускать на выполнение, то она запускается, выполняется, а после выполнения окно консоли закрывается.
При запуске внутри Codeblocks есть специальная настройка, которая не дает окну закрыться.
Решение: Если вам нужно получить информацию о работе программы, то или запросите ввод пользователя, или всю информацию о работе запишите в файл.
8. CodeBlocks запускает предыдущую версию программы
Эта ошибка возникает в том случае, если вы поменяли что-либо в настройках компилятора, но не поменяли программу. Например, если вы предыдущем примере уберете галочку «Пауза после выполнения» и нажмете F9, то программа все равно будет запущена с паузой.
Это происходит потому, что действует правило: компилятор запускается, если вносились исправления в текст программы. Так как исправления не было, то CodeBlocks не запускает компиляцию, а запускает уже готовый файл.
Решение: Вставьте пробел в текст программы и нажмите F9. Или выполните пункт меню «Сборка — Пересобрать».
9. Компиляция проходит без ошибок, но программа не запускается
Эта ошибка доставляет немало неприятных минут. Программист долго ищет ошибку, но никакой ошибки нет.
Программа не запускается, потому что вы не завершили предыдущую запущенную скомпилированную программу, поэтому компилятор не может записать в файл новый скомпилированный код.
В более сложном случае программа зациклилась и нельзя ее нормально завершить. В этом случае нажмите Ctrl+Alt+Del и снимите зависшую программу.
Решение: Завершите запущенную перед этим скомпилированную программу.
10. Антивирус блокирует запись программы на диск
Вы получаете следующее сообщение: «Permission denied».
Решение: Отключите антивирус.
11. Windows блокирует работу CodeBlocks
Бывает так, что на одном компьютере CodeBlocks прекрасно работает, а при копировании на другой компьютер возникают ошибки. Это может быть следствием того, что Windows блокирует некоторые возможности программы.
Решение. Запустите CodeBlocks от имени администратора
Для этого нажмите правую кнопку мыши на файле codeblocks.exe
12. Отладчик не останавливается на точке останова
Вы поставили точку останова, но отладчик ее игнорирует. Это следствие ошибки №4. У вас символы кириллицы или пробелы в пути к программе.
Решение: Создавайте проекты в папке «c:\Work» или в любой другой папке, в пути к которой нет пробелов или кириллицы.
13. Неверное указание пути к компилятору
При запуске CodeBlocks появляется ошибка: «Can’t find compiler executable in your in your configured search path’s for GNU GCC COMPILER»
Это означает, что в настройках неверное указание пути к компилятору. Для исправления зайдите в меню «Настройки — Compiler… — Программы» и нажмите кнопку «Автоопределение».
Если CodeBlocks обнаружит компилятор, то можно работать. Если нет, то переустановите «Си-экспресс».
14. Программа на GTK+ работает только в среде CodeBlocks
Если запускать GTK-программу в среде Code::Blocks, то все работает, а если запустить exe-файл отдельно, то окна не появляются. Это означает, что программа не может найти GTK-библиотеки.
Они есть в сборке «Си-экспресс» в папке GTK-LIB. Их нужно скопировать в папку с программой. Для разработки в папку Debug, а для релиза в папку Release.
Определение манифеста обнаруженной сборки не соответствует ссылке на сборку
Я просто столкнулся с этой проблемой сам, и обнаружил, что проблема была чем-то отличным от того, с чем столкнулись другие.
У меня было две библиотеки DLL, на которые ссылался мой основной проект: CompanyClasses.dll и CompanyControls.dll. Я получал ошибку во время выполнения, говоря:
Не удалось загрузить файл или сборку 'CompanyClasses, версия = 1.4.1.0, Culture = нейтральный, PublicKeyToken = 045746ba8544160c' или одна из ее зависимостей. Определение манифеста обнаруженной сборки не соответствует ссылке на сборку
Проблема была в том, что в моей системе не было файлов CompanyClasses.dll с номером версии 1.4.1. Ни в GAC, ни в папках приложений ... нигде. Я искал весь мой жесткий диск. Все файлы CompanyClasses.dll, которые у меня были, были 1.4.2.
Реальная проблема, которую я обнаружил, заключалась в том, что CompanyControls.dll ссылался на версию 1.4.1 CompanyClasses.dll. Я просто перекомпилировал CompanyControls.dll (после ссылки на CompanyClasses.dll 1.4.2), и эта ошибка исчезла для меня.
Автор: Nathan Bedford Размещён: 17.11.2009 07:15Не удалось загрузить файл или сборку ... параметр задан неверно
Я вижу, что многие технари опубликовали об очистке временных каталогов ASP .Net run-time, относящихся к каждой .Net framework, размещенной на вашем компьютере, как в этой ответ. Но я считаю, что мы должны знать четкую логистику о том, почему нам нужно слепо очистить все временные рабочие каталоги всех .NET-фреймворков. По-моему, так не должно быть.
Я бы посоветовал, что вы должны попробовать точечный поляне подход каталог устранение этой проблемы. Как вы узнаете, какой каталог очистить?
- перейдите в IIS и щелкните правой кнопкой мыши на узле веб-сайта в левой навигационной панели, чтобы открыть контекстное меню. В контекстном меню укажите
Manage Application
->Advanced Settings...
открытьAdvanced Settings
окно. - Проверьте пул приложений, на который назначен ваш сайт. В моем случае это
DefaultAppPool
как показано ниже:
- теперь переходим к
Application Pools
узел в левой панель навигации в IIS. Теперь проверьте, какая версия .Net CLR запускается пулом приложений. В моем случае это v4.0 как показано ниже:
поскольку версия CLR, размещаемая в моем пуле приложений, - v4.0, поэтому я prcisely очистил только временные файлы в папке, относящейся к ASP .NET v4.0 только как показано ниже:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files
и это все. Моя проблема решена.
выучил урок: это указывает на то, что все временные файлы, используемые вашим сайтом, не разбросаны по нескольким каталогам, но они сразу же попадают в пул приложений. Поэтому вам нужно очистить только эту конкретную папку.
Не удалось загрузить файл или сборку ... была сделана попытка загрузить программу, имеющую неверный формат (система.Исключение badimageformatexception)
у меня есть два проекта, ProjectA
и ProjectB
. ProjectB
есть консольное приложение, которое зависит от ProjectA
. Вчера все работало нормально, но вдруг сегодня, когда я бегу ProjectB
Я понимаю:
BadImageFormatException был необработанным:
Не удалось загрузить файл или сборку "ProjectA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" или одну из ее зависимостей. Была сделана попытка загрузить программу, имеющую неверный формат.
оба являются обычными проектами, без каких-либо зависимостей от других non-.Net проекты. Оба полностью .Net - нет собственного кода и нет P / Invoke. У меня есть другие проекты, которые зависят от ProjectA
и все еще работают просто отлично.
вещи, которые я пробовал:
- убедитесь, что оба проекта настроены на "любой процессор" с помощью построить проверено. Они.
- убедитесь, что оба проекта предназначены для одной цели Рамки (Профиль Клиента .Net 4.0).
- в разделе ProjectB --> ссылки --> ProjectA -- > свойства, убедитесь, что "Копировать Локально" установлено значение "правда" _ (я проверил этот проект.dll копируется правильно)
- очистить/перестроить решение. Я даже попытался вручную удалить папки /bin и /obj в обоих проектах.
- Перезапустите Visual Studio. Перезагрузить компьютер.
- проверить совершенно новая копия хранилища.
но я все еще получаю ту же ошибку. Я понятия не имею, что я сделал, чтобы вызвать это, и как это исправить. Есть идеи?
302
автор: BlueRaja - Danny Pflughoeft
21 ответов
Я уверен, что у вас 32-разрядная / 64-разрядная конфликта. Похоже, что ваш основной проект может быть установлен в 32-разрядный, А класс, на который он ссылается, - в 64-разрядный. Попробуйте посмотреть на это так вопрос и и это тоже. Между ними двумя, Вы должны быть в состоянии понять свою проблему.
481
автор: Icemanind
возможно, вы столкнулись с проблемой с вашим сайтом после развертывания на сервере.
затем вам нужно настроить пул приложений для включения 32-разрядных приложений.
действия:
- открыть Диспетчер IIS
- нажмите на пулы приложений
- выберите пул приложений, который вы используете
- на правой панели выберите Дополнительные параметры...
- Set включить 32-разрядные приложения для Правда
153
автор: Ali Adravi
У меня только что было это сообщение об ошибке с IIS Express в Visual Studio 2015. В моем случае мне нужно было запустить 64-разрядную версию IIS Express:
Инструменты - > Параметры - > проекты и решения - > веб-проекты
Установить флажок это говорит: "используйте 64-разрядную версию IIS Express для веб-сайтов и проекты."
скриншоты:
У меня была такая же проблема. Я установил "цель платформы" проекта A ("проект A"(щелкните правой кнопкой мыши)->Свойства->сборка->" цель платформы") в x86, но сохранил проект B в"любом процессоре". Задание проекта " Б " на "x86" это исправил.
У меня была эта проблема с запуском модульных тестов (xunit) в Visual Studio 2015 и наткнулся на следующее исправление:
Menu Bar -> Test -> Test Settings -> Default Processor Architecture -> X64
возможно, Вам придется изменить Приложение, Бассейн настройка "Enable 32bit Applications" на TRUE в IIS7, если у вас есть по крайней мере 1 32bit dll\exe в вашем проекте.
У меня была такая же проблема с несколькими проектами в одном решении, я закончил установку всех целевых фреймворков в .NET Framework 4 и x86 для целевого процессора, и он, наконец, успешно скомпилирован.
2
автор: Flood Techs
вы также можете увидеть эту проблему, если вы пытаетесь упаковать 64-битный проект с установщиком MSI в VS. ("Причина в том, что родная прокладка упакована с помощью .MSI-файл представляет собой 32-разрядный исполняемый файл.")
см. здесь для получения более подробной информации: http://blogs.msdn.com/b/heaths/archive/2006/02/01/64-bit-managed-custom-actions-with-visual-studio.aspx
ни одно из этих решений не сработало для меня, но, удалив содержимое папок bin и obj, все снова стало круто.
Я получил это при создании проекта через Visual Studio Online (VSTS) Build с помощью Visual Studio Build
действия.
решение:
- удалить существующую исходную папку
- явно установите "любой процессор" в платформе для всех сборок Visual Studio, включая зависимости (см. снимок экрана ниже).
- повторно запустите сборку
Я столкнулся с такой же проблемой. Он выскочил из ниоткуда, и это показалось мне странным.
в снимке исключения для FusionLog я увидел следующее в его сообщении:
... C:\Windows\Microsoft.NET\Framework64 ...
подробнее о журнале слияния:http://msdn.microsoft.com/en-us/library/e74a18c4 (v=против 110).aspx
все проекты имели целевой процессор AnyCPU. Я изменил проект приложения ( проект, который ссылается на все другие проекты) на целевой процессор x86. Теперь это работает.
Не уверен, как целевой процессор перепутался без видимой причины, но это произошло.
1
автор: Jeremy Ray Brown
Я также сталкиваются с этой проблемой в проекте, через несколько минут я нашел решение, эта проблема связана с конфигурацией CPU, Если вы используете Visual Studio 2010 или VS 2013, just goto project ' s свойства и выберите Compile из боковой панели, и будет 5 выпадающих, 5-й выпадающий будет целевой процессор:, вы должны установить его на x86 или x64 согласно вашим требованиям вместо любого К. П. У.
моя проблема была решена после замены его на x86.
1
автор: Jawad Nadeem
Это также может произойти, просто имея несколько поддерживаемых платформ определена в app.config файл и, заставляя приложение работать в другой .NET framework, отличной от одной упоминается первым в приложении.файл config.
а также это срабатывает, когда у вас есть оба упомянутых фреймворка, доступных в вашей системе.
в качестве обходного пути вызовите целевую структуру, которую вы собираетесь использовать для отладки в приложение.config
ex: если вы пытаетесь запустить в .NET 4, файл конфигурации должен иметь что-то похожее на это,
<supportedRuntime version="v4.0"/> <supportedRuntime version="v2.0.50727"/>
в моем проекте для C#, свойство проекта - >[Build] - >цель платформы: любой процессор, и снимите флажок предпочесть 32-бит, чтобы компилятор мог выбирать автоматически.
сборка Chilkat .NET 4.5 требует, чтобы среда выполнения VC++ 2012 или 2013 была установлена на любом компьютере, где работает ваше приложение. Большинство компьютеров уже установили его. Ваш компьютер будет иметь его, потому что Visual Studio был установлен. Однако при развертывании на компьютере, где не доступна требуемая среда выполнения VC++, произойдет следующая ошибка:
установите все пакеты ниже
распространяемые пакеты Visual C++ для Visual Studio 2013-vcredist_x64
распространяемые пакеты Visual C++ для Visual Studio 2013-vcredist_x86
распространяемые пакеты Visual C++ для Visual Studio 2012-vcredist_x64
распространяемые пакеты Visual C++ для Visual Studio 2012-vcredist_x86
1
автор: Sukesh Chand
прежде всего, я получил это в VS2017 со старым проектом, который мне нужно было сделать крошечные изменение и upraded все проекты в рамках 4.7.
несколько других упомянули выбор Any CPU
исправить эту проблему.
есть несколько мест, где вам нужно это сделать, и это может быть не так просто, как выбор из раскрывающегося списка. Это исправило его для меня:
1) вам нужно сделать это оба здесь:
2), а также в Configuration Manager
(правой кнопкой мыши на решение)
но что, если его не существует???
нажмите кнопку New
и выберите следующие настройки: ( спасибо @RckLN)
1
автор: Simon_Weaver
Если вы используете LibreOffice из своей программы через CLI .net integration как и я, я получил ту же ошибку. Я использую старую версию LibreOffice в производственной среде на моем компьютере установлена более новая версия, которая была в конфликте. просто удалите LibreOffice. Я нашел решение здесь .NET CLI: не удалось загрузить файл или сборку 'cli_cppuhelper'
1
автор: Jan Sršeň
Это может быть немного смешно, но у меня была такая же проблема с обычным рабочим кодом. Я добавил StreamWriter и StreamReader, и это дало эту ошибку. Решение было в том, что я взял этот код в скобки комментариев, затем отладил, и он снова начал работать
0
автор: Hovhannes Babayan
моя машина показала мне обновление BIOS, и я задался вопросом, связано ли это с внезапным появлением этой ошибки. И после того, как я сделал обновление, ошибка была решена, и решение построено нормально.
вы пытаетесь запустить свой .exe-файл из cmd? Это была моя ошибка. Просто запустите .EXE-файл, дважды щелкнув его. Если это .NET Core SCD для Windows 8.1 / Windows Server 2012 R2 x64.
visual studio - VS2005: Assembly '' неправильно указан как файл.
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
Assembly '' неправильно указан как файл.
Assembly '' неправильно указан как файл.
Опубликовано: 02.07.2008 в .NetТеги: C # сборка, проблема
Сборка «
Сегодня я столкнулся с этой ошибкой, моя ситуация была довольно простой, я добавил 5 dll внешних dll и приступил к ссылкам на них. Сделал это тысячу раз, прежде чем включать те же самые dll для клиента проекта клиент-сервер….Никаких проблем с этим.
На этот раз возникла проблема, сбитая с толку и немного озадаченная. Я несколько раз пытался перестроить, полностью очистить, переориентировать, без реферирования и так далее. Все без решения. В конце концов я обратился за помощью к более опытным специалистам, и все попробовали одно и то же, все были сбиты с толку.
Наконец-то меня осенила идея: папка, которую я использовал для хранения библиотек DLL, была названа «Includes», я переименовал ее в lib (разговор о старой школе), и ошибки исчезли.
Как указано:
Исправление: Не называйте содержащую dll папку «Включает», поскольку она кажется зарезервированной….и нет, это не был веб-проект, это был проект приложения Windows. ( Примечание автора: это исправление не работает, продолжайте читать )
—————- ОБНОВЛЕНИЕ —————-
AGGGGGGGGG Сборка «
На этот раз я попробовал что-то еще, на этот раз я установил для действия сборки значение none и скопировал, если новее, для каждой DLL, генерирующей это предупреждение.
Похоже, предупреждения исчезли, плюс программа все еще компилируется и запускается (с полной очисткой каталога).
Во всяком случае не знаю почему, плюс сайт MS совершенно бесполезен. Оставьте комментарий, если вам есть что добавить.
Исправить. Установите для сборки действие сборки значение none.
Ура
Choco
BTW Ешьте только выращенную рыбу, скоро бездонная яма, называемая морем, не станет такой бездонной.
Нравится:
Нравится Загрузка...
Связанные
.c # - Не удалось загрузить файл или сборку Microsoft.AI.Web или одну из его зависимостей. Система не может найти указанный файл
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
Установите сборку в GAC - C #
- 5 минут на чтение
В этой статье
В этой статье содержится информация о том, как установить сборку в глобальный кэш сборок в Visual C #.
Исходная версия продукта: Visual C #
Оригинальный номер базы знаний: 815808
Сводка
В этой статье описывается, как создать строгое имя для сборки и как установить.dll в глобальном кэше сборок (GAC). С помощью GAC вы можете совместно использовать сборки во многих приложениях. GAC автоматически устанавливается вместе со средой выполнения .NET. Компоненты обычно хранятся в C: \ WINNT \ Assembly
.
Чтобы установить сборку в GAC, необходимо дать сборке строгое имя. Имя представляет собой криптографический хэш-ключ или подпись. Это строгое имя обеспечивает правильное управление версиями компонентов. Это помогает предотвратить конфликты компонентов с одинаковыми именами друг с другом или их неправильное использование приложением-потребителем.
Требования
- Права администратора на компьютере, на котором устанавливается общая сборка
- Общее знакомство со сборками в .NET.
- Общее знакомство с использованием инструментов командной строки.
Глобальный кэш сборок
Чтобы создать небольшой проект библиотеки классов с помощью Visual Studio, сгенерировать строгое имя и установить DLL-файл проекта в GAC, выполните следующие действия:
-
В Visual Studio создайте новый проект библиотеки классов Visual C # и назовите проект GACDemo .
-
Вы должны использовать строгое имя. Чтобы сгенерировать эту пару криптографических ключей, используйте инструмент строгого имени (Sn.exe). Этот инструмент находится в подкаталоге
\ bin
, в котором установлен пакет разработчика решений .NET Framework (SDK). Инструмент Sn.exe прост в использовании. Оператор командной строки принимает следующий кодsn -k "[DriveLetter]: \ [DirectoryToPlaceKey] \ [KeyName] .snk"
Примечание
В Visual Studio можно использовать свойства проекта IDE для создания пары ключей и подписи сборки.Затем вы можете пропустить шаги 3 и 4, а также пропустить любые изменения кода в файле AssemblyInfo.cs .
Чтобы использовать свойства проекта IDE для создания пары ключей и подписи сборки, выполните следующие действия:
-
В обозревателе решений щелкните правой кнопкой мыши GACDemo , а затем щелкните Свойства .
-
Щелкните вкладку Подпись , а затем установите флажок Подпись сборки .
-
В списке Выберите ключ строгого имени щелкните <Создать...> .
-
Введите GACkey.snk в качестве имени файла ключа, снимите флажок Защитить мой файл ключа паролем , а затем нажмите ОК .
-
Нажмите сочетание клавиш CTRL + SHIFT + B, чтобы скомпилировать проект.
После выполнения этих шагов вы все равно должны выполнить шаг 5, чтобы установить сборку в GAC.
-
-
Создайте каталог с именем GACKey в
C: \
, чтобы вы могли легко найти ключ и получить доступ к нему из командной строки.Для большинства пользователей инструменты .NET расположены в
C: \ Program Files \ Microsoft.NET \ FrameworkSDK \ Bin
. Перед тем как ввести следующую команду, вы можете скопировать этот аналогичный путь на своем компьютере в каталог bin .NET. Введите в командной строкеcd
, щелкните правой кнопкой мыши, чтобы вставить путь, а затем нажмите клавишу ВВОД, чтобы быстро перейти в каталог, в котором находится SN Tool.Введите следующую команду:
sn -k "C: \ GACKey \ GACkey.snk"
-
Ключ создан, но он еще не связан со сборкой проекта.Чтобы создать эту связь, дважды щелкните файл AssemblyInfo.cs в обозревателе решений Visual Studio .NET. Этот файл содержит список атрибутов сборки, которые включаются по умолчанию при создании проекта в Visual Studio .NET. Измените атрибут сборки
AssemblyKeyFile
в коде следующим образом:[сборка: AssemblyKeyFile ('C: \\ GACKey \\ GACKey.snk')]
Скомпилируйте проект, нажав CTRL + SHIFT + B. Вам не нужен дополнительный код для установки.dll в GAC.
-
Вы можете установить файл .dll с помощью инструмента Gacutil или перетащив файл .dll в соответствующую папку. Если вы используете инструмент Gacutil, вы можете использовать команду следующего вида:
gacutil -I "[DriveLetter]: \ [PathToBinDirectoryInVSProject] \ gac.dll"
Чтобы перетащить файл, откройте два экземпляра проводника Windows. В одном случае найдите расположение выходного файла .dll для вашего консольного проекта. В другом случае найдите
c: \
.Затем перетащите файл .dll в папку Assembly.\ Assembly
Полный список кодов (AssemblyInfo.cs)
с использованием System.Reflection; using System.Runtime.CompilerServices; // Общая информация о сборке контролируется с помощью следующих // набор атрибутов. Измените значения этих атрибутов, чтобы изменить информацию // который связан со сборкой. [сборка: AssemblyTitle ("")] [сборка: AssemblyDescription ("")] [сборка: AssemblyConfiguration ("")] [сборка: AssemblyCompany ("")] [сборка: AssemblyProduct ("")] [сборка: AssemblyCopyright ("")] [сборка: AssemblyTrademark ("")] [сборка: AssemblyCulture ("")] // Информация о версии сборки состоит из следующих четырех значений: // Основная версия // Дополнительная версия // Номер сборки // Редакция // Вы можете указать все значения или по умолчанию номера ревизии и сборки // используя '*', как показано ниже: [сборка: AssemblyVersion ("1.0. * ")] // Чтобы подписать вашу сборку, вы должны указать используемый ключ. Увидеть // Документация Microsoft .NET Framework для получения дополнительной информации о подписи сборок. // Используйте следующие атрибуты для управления тем, что ключ используется для подписи. // Ноты: // (*) Если ключ не указан, сборка не подписана. // (*) KeyName относится к ключу, который был установлен в Crypto Service // Провайдер (CSP) на вашем компьютере. KeyFile - это файл, содержащий // ключ. // (*) Если указаны значения KeyFile и KeyName, // происходит следующая обработка: // (1) Если KeyName можно найти в CSP, используется этот ключ.// (2) Если KeyName не существует, а KeyFile существует, ключ // в KeyFile устанавливается в CSP и используется. // (*) Чтобы создать KeyFile, вы можете использовать утилиту sn.exe (Strong Name). // При указании KeyFile расположение KeyFile должно быть // относительно выходного каталога проекта, который //% Project Directory% \ obj \ <конфигурация>. Например, если ваш KeyFile // расположенный в каталоге проекта, вы должны указать AssemblyKeyFile // атрибут как [сборка: AssemblyKeyFile (".. \\ .. \\ mykey.snk ")] // (*) Delay Signing - это расширенная опция - см. Microsoft .NET Framework // документация для получения дополнительной информации об этом. [сборка: AssemblyDelaySign (false)] [сборка: AssemblyKeyFile ("C: \\ GACKey \\ GACKey.snk")] [сборка: AssemblyKeyName ("")]
Проверка
- Запустите проводник Windows.
- Найдите
C: \ SystemRoot \ assembly
. - Вы видите GACDemo в списке установленных файлов .dll.
Список литературы
.asp.net - Не удалось загрузить файл, сборку или одну из ее зависимостей. В доступе отказано. Проблема случайная, но после того, как она возникает один раз, она продолжается
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании
.net - GAC - Сборка находится в GAC, но «Не удалось загрузить файл или сборку»
Переполнение стека- Около
- Продукты
- Для команд
- Переполнение стека Общественные вопросы и ответы
- Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
- Вакансии Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
- Реклама Обратитесь к разработчикам и технологам со всего мира
- О компании