相关疑难解决方法(0)

C#字符串替换为字典

我有一个字符串,我需要做一些替换.我有一个Dictionary<string, string>我定义的搜索替换对的地方.我创建了以下扩展方法来执行此操作:

public static string Replace(this string str, Dictionary<string, string> dict)
{
    StringBuilder sb = new StringBuilder(str);

    return sb.Replace(dict).ToString();
}

public static StringBuild Replace(this StringBuilder sb, 
    Dictionary<string, string> dict)
{
    foreach (KeyValuePair<string, string> replacement in dict)
    {
        sb.Replace(replacement.Key, replacement.Value);
    }

    return sb;
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

c# string dictionary replace

31
推荐指数
3
解决办法
2万
查看次数

Visual Studio模板和目录创建的问题

我正在尝试制作一个Visual Studio(2010)模板(多项目).一切似乎都很好,除了项目是在解决方案的子目录中创建的.这不是我正在寻找的行为.

该zip文件包含:

Folder1
+-- Project1
    +-- Project1.vstemplate
+-- Project2
    +-- Project2.vstemplate
myapplication.vstemplate
Run Code Online (Sandbox Code Playgroud)

这是我的根模板:

<VSTemplate Version="3.0.0" Type="ProjectGroup" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005">
    <TemplateData>
        <Name>My application</Name>
        <Description></Description>
        <Icon>Icon.ico</Icon>
        <ProjectType>CSharp</ProjectType>
  <RequiredFrameworkVersion>4.0</RequiredFrameworkVersion>
  <DefaultName>MyApplication</DefaultName>
  <CreateNewFolder>false</CreateNewFolder>
    </TemplateData>
    <TemplateContent>
        <ProjectCollection>
   <SolutionFolder Name="Folder1">
    <ProjectTemplateLink ProjectName="$safeprojectname$.Project1">Folder1\Project1\Project1.vstemplate</ProjectTemplateLink>
    <ProjectTemplateLink ProjectName="$safeprojectname$.Project2">Folder2\Project2\Project2.vstemplate</ProjectTemplateLink>
   </SolutionFolder>
        </ProjectCollection>
    </TemplateContent>
</VSTemplate>
Run Code Online (Sandbox Code Playgroud)

而且,在使用此模板创建解决方案时,我最终会得到如下目录:

Projects
+-- MyApplication1
    +-- MyApplication1 // I'd like to have NOT this directory
        +-- Folder1
            +-- Project1
            +-- Project2
    solution file
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

编辑:

似乎<CreateNewFolder>false</CreateNewFolder>无论是真还是假,修改都不会改变任何东西.

templates project visual-studio

26
推荐指数
3
解决办法
9912
查看次数

如何在Visual Studio 2017中使用CMake设置编译器选项

Visual Studio 2017提供完整的CMake集成.要了解这个组合,我从这个基本样本开始:

# CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(foo)
add_executable(foo foo.cpp)
Run Code Online (Sandbox Code Playgroud)

// foo.cpp
int main() {}
Run Code Online (Sandbox Code Playgroud)

这正确地生成了构建脚本,并且编译和链接没有任何问题.那很简单.

另一方面,试图设置编译器选项,结果却是微不足道的.在我的情况下,我试图将警告级别设置为4.

明显的解决方案

add_compile_options("/W4")
Run Code Online (Sandbox Code Playgroud)

没有像预期的那样平息.传递给编译器的命令行现在既包含/W4(按预期),也包含/W3(从其他地方获取),产生以下警告:

cl : Command line warning D9025: overriding '/W3' with '/W4'
Run Code Online (Sandbox Code Playgroud)

要解决这个问题,我需要替换任何不兼容的编译器选项,而不是只添加一个.CMake没有为此提供任何直接支持,标准解决方案(正如此问答所示)似乎是:

if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
endif()
Run Code Online (Sandbox Code Playgroud)

然而,这有两个问题:

  • 它设置全局CMAKE_CXX_FLAGS,适用于所有C++目标.这可能不是有意的(现在对我来说不是问题).
  • 它不会扩展.对于要添加的每个编译器选项,您必须阅读不兼容的选项,并首先手动删除它们.这将不可避免地失败1.

我的问题是双重的:

  1. CMake集成从哪里获取默认设置,是否可以控制?
  2. 如何设置编译器选项?(如果这个主题过于宽泛,我会很乐意帮助您设置警告级别.)


1 顺便说一下,我复制的解决方案没有考虑到/Wall选项,这也是不兼容的/W4.

cmake visual-c++ visual-studio-2017

21
推荐指数
3
解决办法
2万
查看次数