Как установить значок для приложения С# Windows Forms через cmake без файла ресурсов?

Описание проблемы

Я генерирую файлы проекта и решения для приложения Windows Forms через cmake. В папке ресурсов проекта есть несколько файлов .ico, из которых я хочу выберите my_icon3.ico в качестве значка для моего приложения. Если я открою проект сразу после создание по cmake, тогда (Default Icon) выбирается, как показано здесь:

Как установить значок для приложения С# Windows Forms через cmake без файла ресурсов?

Мне нужна команда cmake, которая напрямую устанавливает иконку на my_icon3.ico:

Как установить значок для приложения С# Windows Forms через cmake без файла ресурсов?

Как мне добиться этого с моим CMakeLists.txt без файла ресурсов?

Спасибо за вашу помощь.

MCVE

Пожалуйста, найдите здесь пример, чтобы воспроизвести мою проблему:

1) Откройте MS Visual Studio 15 --> Новый --> Проект... --> Приложение Windows Forms
2) Установить имя: я выбрал P0001 и путь --> Ok
3) Создайте папку Resources в исходном каталоге и скопируйте в нее произвольную иконку. Я выбрал my_icon2.ico и my_icon3.ico.
4) Закрыть MS Visual Studio 15
5) Скопируйте следующий файл CMakeLists.txt в базовый репозиторий:

cmake_minimum_required (VERSION 3.5)

get_filename_component(CMAKE_MODULE_PATH ${CMAKE_COMMAND} DIRECTORY)

include(CSharpUtilities) 

#generates the directory structure given in globalDirPath.
#returns all found files (allFiles) - which need to be added to the output
function(AutoGenDirStruct globalDirPath filterF includeParentDirectory allFiles)
    if (${includeParentDirectory})
        string(FIND ${globalDirPath} "/" startPos REVERSE)
        MATH(EXPR startPos "${startPos}+1")
        string(SUBSTRING ${globalDirPath} ${startPos} 100 subDir)
        string(SUBSTRING ${globalDirPath} 0 ${startPos} globalDir)
        AutoGenDirStructInternalOnly(${globalDir} ${subDir})
    else()
        AutoGenDirStructInternalOnly(${globalDirPath} "")
    endif ()

    foreach(filter ${${filterF}})
        file(GLOB_RECURSE allFilesLocal "${globalDirPath}/${filter}")
        set(mergedFiles ${mergedFiles} ${allFilesLocal})
    endforeach()
    set(${allFiles} ${mergedFiles} PARENT_SCOPE)

endfunction()

function(AutoGenDirStructInternalOnly globalDirPath subDirectoryName)

   file(GLOB children RELATIVE "${globalDirPath}/${subDirectoryName}" "${globalDirPath}/${subDirectoryName}/*")

   foreach(child ${children})

          if (IS_DIRECTORY ${globalDirPath}/${subDirectoryName}/${child})

            AutoGenDirStructInternalOnly(${globalDirPath} ${subDirectoryName}/${child})

          else()

              if (NOT ${subDirectoryName} STREQUAL "")
                string(REPLACE "/" "\\" groupname ${subDirectoryName})
                source_group(${groupname} FILES ${globalDirPath}/${subDirectoryName}/${child})
              endif ()

          endif ()

   endforeach()

endfunction()

SET(CMAKE_INCLUDE_CURRENT_DIR ON)
SET(CMAKE_CSharp_FLAGS "/langversion:7")
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)

project (P0001)

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})

# Sub-directories where more CMakeLists.txt exist
ADD_SUBDIRECTORY(P0001/SRC)

6) Скопируйте следующий файл CMakeLists.txt в исходный каталог:

cmake_minimum_required (VERSION 3.8)
enable_language(CSharp)

file(GLOB SOURCES
    "*.cs"
    "*.resx"
)

SET(filter "*.cs" "*.bmp" "*.po" "*.ico" "*.config" "*.settings" "*.resx") 
AutoGenDirStruct(${CMAKE_CURRENT_SOURCE_DIR} filter TRUE SOURCES)
csharp_set_designer_cs_properties(${SOURCES}) 
csharp_set_windows_forms_properties(${SOURCES})

add_executable(P0001 WIN32 ${SOURCES} ${EXTERNAL} ${RES_FILES})

set_target_properties(P0001 PROPERTIES VS_GLOBAL_ROOTNAMESPACE "P0001") 

set_property(TARGET P0001 PROPERTY VS_DOTNET_REFERENCES "System;System.Data;System.Configuration;System.Core;System.Data.DataSetExtensions;System.Xml;System.Xml.Linq;System.Windows.Forms;System.Drawing")
set_property(TARGET P0001 PROPERTY FOLDER "Gui")
set_property(TARGET P0001 PROPERTY VS_DOTNET_TARGET_FRAMEWORK_VERSION "v4.0")

7) Позвоните cmake, чтобы сгенерировать решение для MS Visual Studio 15, чтобы получить скриншот 1.

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

<Base dir>
  |--<Build>                       # folder for cmake
  |--CMakeLists.txt                # file from 5)
  |--<P0001>
  |    |--<SRC>
  |    |    |--CMakeLists.txt      # file from 6)
  |    |    |--<Resources>
  |    |    |    |--my_icon3.ico   # required icon

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

Связанные вопросы

Я нашел некоторую помощь в сети, но она больше связана с C++:

Установка значка приложения с помощью CMake

либо требуется файл resource:

[CMAKE] Установка значка и для исполняемого файла Windows

[РЕШЕНО] RC-файлы и CMake: проблема с исполняемым значком (Visual Studio)

Неужели нет другого способа настроить это через cmake?

Еще раз спасибо.


Спасибо за ссылки, они весьма полезны для моего сценария C++.

caoanan 23.04.2019 03:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
1 189
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю:

set_property(TARGET P0001 PROPERTY VS_GLOBAL_ApplicationIcon "${CMAKE_CURRENT_SOURCE_DIR}/Resources/my_icon3.ico")

сделает работу.

Спасибо, этот параметр свойства в cmake работает так, как нужно.

CKE 13.02.2019 10:05

Другие вопросы по теме