问题描述
我想用 C# 创建一个 VC++ 项目.我看到这篇 MSDN 文章关于创建 C# 和 VB 控制台应用程序项目
.但是VC++项目怎么办?
I want to to create a VC++ project with C#. I see this MSDN article about creating C# and VB console application projects
. But how to do with VC++ project?
我遇到了与以下线程完全相同的问题.它的解决方案是操作原始 XML,这是悲惨的...是否有某种我可以使用的 API?
I had exactly the same issue as below thread. And its solution is to manipulate the raw XML, which is miserable... Is there some kind of API that I can work with?
除了创建一个 .vcxproj
文件之外.我想以编程方式创建一个解决方案 .sln
文件.因为我的代码库被分成了很多项目.
And besides creating a .vcxproj
fie. I want to programmatically create a solution .sln
file. Because my codebase are separated into many projects.
推荐答案
好的.我通过直接操作 *.sln
和 *.vcxproj
文件解决了这个问题.
OK. I solved this problem by manipulating the *.sln
and *.vcxproj
files directly.
详情:
对于 *.vcxproj
文件,我创建了以下模板:
For *.vcxproj
file, I created the following template:
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
__SM_C_FILES__
</ItemGroup>
<ItemGroup>
__SM_H_FILES__
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>__SM_PROJECT_GUID__</ProjectGuid>
<RootNamespace>__SM_PROJECT_ROOTNS__</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v120</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>__SM_ADDITIONAL_INCLUDE_DIRS_DEBUG__</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<AdditionalIncludeDirectories>__SM_ADDITIONAL_INCLUDE_DIRS_RELEASE__</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
__SM_C_FILES__
包含这样的子模板:
<ClCompile Include="__SM_C_FILE__" />
__SM_H_FILES__
包含这样的子模板:
<ClInclude Include="__SM_H_FILE__" />
对于 *.sln
文件,我创建了一个模板如下:
For *.sln
file, I created a template as below:
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.40629.0
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "__SM_PROJ_NAME__", "__SM_PROJ_FILE_PATH__", "__SM_PROJ_GUID__"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{__SM_PROJ_GUID__}.Debug|Win32.ActiveCfg = Debug|Win32
{__SM_PROJ_GUID__}.Debug|Win32.Build.0 = Debug|Win32
{__SM_PROJ_GUID__}.Release|Win32.ActiveCfg = Release|Win32
{__SM_PROJ_GUID__}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
注意 __SM_*__
部分,我使用纯字符串替换将它们替换为 project-specific
内容,这非常简单.
Note the __SM_*__
parts, I replace them with the project-specific
content using the plain string replacement, which is pretty straight-forward.
并且在*.sln
文件中,如果你有多个项目,你可能需要生成Project
部分的多个部分.
And in the *.sln
file, if you have multiple projects, you may need to generated multiple parts of the Project
sections.
{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}
是一个众所周知的 GUID,代表 VC++
项目类型.可以在此处找到完整列表.
The {8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}
is a well-known GUID that represents the VC++
project type. A comprehensive list can be found here.
因此,我避免操作 XML.
Thus, I avoided manipulating the XML.
与这个类似的线程不同,我没有创建 *.vcxproj.filters
文件.虽然看起来有点难看,但我现在可以忍受.
Unlike this similar thread, I didn't create the *.vcxproj.filters
file. Though it looks a bit ugly, but I can live with that for now.
这篇关于如何使用 C# 以编程方式创建 VC++ 项目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!