我有带有以下标签的 csproj:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>Bin\Debug</OutputPath>
<DefineConstants>TRACE;DEBUG;SILVERLIGHT;WINDOWS_PHONE;SUPPORTS_ICLOUD</DefineConstants>
<NoStdLib>true</NoStdLib>
<NoConfig>true</NoConfig>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
在这里,如果您看到我添加了一个名为 的宏SUPPORTS_ICLOUD。
我有 .txt 文件,其中包含以下内容:
#define SUPPORTS_IN_APP_PURCHASE
#define BUTTON_THEME
#define SUPPORTS_TITLE
#define HAS_HTML_IMAGE_CONTENT
#define TINT_COLOR
#define NAVIGATIONTITLE_TEXT_COLOR
#define SUPPORTS_ICLOUD
Run Code Online (Sandbox Code Playgroud)
正如您在我的文本文件中看到的那样,我定义了许多宏,现在DefineConstants我可以将其作为文件或字符串一起传递,以便它能够接受所有这些宏,而不是传递每个宏吗?这可能还是有其他方法?
编辑
这是我的 csproj 文件:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProductVersion>10.0.20506</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{0D446418-B7CD-4624-91F4-F3E382F8DD23}</ProjectGuid>
<ProjectTypeGuids>{C089C8C0-30E0-4E22-80C0-CE093F111A43};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>POCChild3</RootNamespace>
<AssemblyName>POCChild3</AssemblyName>
<TargetFrameworkIdentifier>WindowsPhone</TargetFrameworkIdentifier>
<TargetFrameworkVersion>v8.0</TargetFrameworkVersion>
<SilverlightVersion>$(TargetFrameworkVersion)</SilverlightVersion>
<SilverlightApplication>true</SilverlightApplication>
<SupportedCultures>
</SupportedCultures>
<XapOutputs>true</XapOutputs>
<GenerateSilverlightManifest>true</GenerateSilverlightManifest>
<XapFilename>POCChild3_$(Configuration)_$(Platform).xap</XapFilename> …Run Code Online (Sandbox Code Playgroud) 我有一个包含一些项目的 Visual Studio C# 解决方案。其中一个项目需要引用另一个不属于解决方案的项目。
一开始我引用了dll:
<ItemGroup>
<Reference Include="ExternalProj1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Proj1\ExternalProj1.dll</HintPath>
</Reference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
但是,我必须引用项目,以便这些项目生成它们的 dll。事实上,如果我引用了 dll 而它们还没有被创建,我需要单独构建这些项目。
但是,在引用项目时:
<ItemGroup>
<ProjectReference Include="..\..\Proj1\ExternalProj1">
<Project>{3341b552-a569-4313-aabc-34452fff60ac}</Project>
<Name>ExternalProj1</Name>
</ProjectReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
但是在构建编译器时找不到这些程序集。奇怪的是,构建过程报告为成功完成,但错误窗口报告了一个警告:
找不到引用的组件 ExternalProj。
那么,我做错了什么?谢谢
我的应用程序中有一个可选的配置文件,用于特定于实例的配置。该应用程序无需它即可运行,并且仅当您想配置一些附加功能时才需要它。因此它不应该包含在源代码管理中,因为每个开发人员和客户端部署都不需要它,而那些需要它的人会有不同的值。
我在弄清楚如何配置它以进行持续部署时遇到问题。我可以毫无问题地在构建服务器上生成文件。但是,由于 MsDeploy 读取 csproj 以确定要部署哪些文件,因此我的 csproj 必须跟踪此文件才能实际移动到部署服务器。但是如果我通过我的 csproj 跟踪它,那么它就不再是可选的,没有它我就无法构建应用程序。我正在使用 Mercurial,它没有提交一个版本忽略后续功能(git 的--assume-unchanged),所以在这方面的选项似乎非常有限。我坚信应该可以克隆一个 repo 并立即运行该项目,所以我真的不喜欢提交无法构建的东西的想法。
csproj 文件中是否有一种方法可以指示文件应作为内容(如果存在)包含在内,否则应忽略?
在 C# 项目中是否有引用 Microsoft Bond 架构文件的标准方法?
During my build process I'm trying to copy a folder to the artifacts folder (\myserver\d$\TFBuild-Agent01\66\a).
So I put this in the .csproj file:
<Target Name="BeforeBuild">
<Exec
Command="xcopy.exe Databases "$(Build.ArtifactStagingDirectory)\Databases" /i /e /y /d" />
</Target>
Run Code Online (Sandbox Code Playgroud)
This gets me
Error MSB4184: The expression """.ArtifactStagingDirectory" cannot be evaluated. Method 'System.String.ArtifactStagingDirectory' not found*
Everything I can find online says that $(Build.ArtifactStagingDirectory) is the way to do it. But it doesn't work.
Building with Visual Studio 2015 on TFS 2015
This doesn't work either: …
我是一名大学生。我想在我的课程中使用 .NET Core。为此,我的代码需要在部门 Linux 集群上编译和运行,因为这是我的导师测试我提交的内容。
我的系统管理员在试用的基础上为我安装了最近发布的 .NET Core 2.0 RHEL 包。我创建、构建并运行了Microsoft 提供的示例 CLI 项目,并且它们运行良好。但是我的系统管理员很不高兴,因为dotnet在(全局)/tmp 中创建了至少一个文件,在我注销后它仍然存在。
-rw------- myuser mygroup /tmp/.NETCoreApp,Version=v2.0.AssemblyAttributes.cs
Run Code Online (Sandbox Code Playgroud)
原则上,他不希望dotnet在/tmp中创建任何在其进程完成后不会清理的文件。更重要的是,当他试图自己构建微软的样本时,它失败了;dotnet试图访问上述文件,他的用户没有读取权限!
理想情况下,dotnet不会创建任何生命周期与其正在构建的项目不同的文件。为了实现这一点,任何这样的文件都可以存在于项目目录中——可能在bin子目录下,以便 aclean将清除它们。有没有办法让dotnet这些文件写在那里?否则,它是否可以至少使用临时文件名,以避免我们遇到的权限冲突?
无论解决方案是什么,它都必须是全系统的,不能依赖于用户的良好行为。所以像要求用户设置$TMPDIR这样的事情是行不通的。
我有一个我部分拥有的代码生成器工具,现在 csproj 文件可以在其中列出多个目标框架并构建所有这些框架,我试图弄清楚如何使 MSBuild 目标只进行一次代码生成运行构建,无论列出了多少个目标框架,并让每个目标框架的编译等待代码生成完成。
我目前以 TargetFramework 的特定值为条件。例如,Condition="'netstandard2.0' == '$(TargetFramework)'"。
这避免了同时为每个目标框架启动代码生成工具,然后在进程尝试创建/更新相同文件时出现访问被拒绝错误。
但是,其他目标框架会在不等待代码生成完成的情况下直接尝试编译,并且在没有该代码的情况下失败。
我希望每次构建项目时只生成一次代码,并且每个目标框架的编译只在完成后开始。
它需要在每次构建运行时运行,以防输入发生变化并生成不同的代码。
注意:目前我忽略了一种情况,其中#if FrameworkSpecificDefine用于代码生成器的输入代码不同,因此不同的目标框架会导致代码生成器的输出不同。目前,我正在考虑代码生成器的输出在所有目标框架中都相同且有效。
更新:在寻找在 MSBuild 拆分为 TargetFramework 特定构建之前发生的目标之后,我可以在之前挂钩构建,我在 VS 的详细构建输出中看到了这一点:
1>Target _SetBuildInnerTarget:
1>Target _ComputeTargetFrameworkItems:
1>Target DispatchToInnerBuilds:
1> Using "MSBuild" task from assembly "Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
1> Task "MSBuild"
1> Additional Properties for project "ProjectA.csproj":
1> TargetFramework=netstandard2.0
1> Additional Properties for project "ProjectA.csproj":
1> TargetFramework=net47
Run Code Online (Sandbox Code Playgroud)
然后我将我的目标设置为BeforeTargets="DispatchToInnerBuilds",它在专门设置 TargetFramework 的个人构建之前运行,并且似乎完全满足我的需求。
(添加到BuildDependsOn属性似乎不再起作用:添加在 Visual Studio 2017 RC 中构建 .NET Core 项目后运行的 …
我有一些资源需要嵌入到 DLL 中。如果我使用 Visual Studio,我可以使用 UI 添加它们。这会将以下内容添加到csproj文件中:
<EmbeddedResource Include="Mocks\MyMock.GetDimensions().json" />
dotnet不,我喜欢使用终端命令添加资源。我该怎么办?
我正在 PowerShell 中(重新)生成一些文件,并且需要将这些文件嵌入到 DLL 中,以便我的代码可以访问它。
我想在编译主单元之前在程序集中嵌入本地引用。但是写的目标不起作用。
<Target Name="EmbedLocal" BeforeTargets="CoreCompile">
<Message Text="Run EmbedLocal for $(MSBuildProjectFullPath)..." Importance="high"/>
<ItemGroup>
<EmbeddedResource Include="@( ReferencePath->WithMetadataValue( 'CopyLocal', 'true' )->Metadata( 'FullPath' ) )"/>
</ItemGroup>
<Message Text="Embed local references complete for $(OutputPath)$(TargetFileName)." Importance="high" />
</Target>
Run Code Online (Sandbox Code Playgroud)
@(EmbeddedResource) 此时包含有效的路径列表。
更新:
现在我的导入文件包含:
<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<EmbedLocalReferences Condition=" '$(EmbedLocalReferences)' == '' ">True</EmbedLocalReferences>
</PropertyGroup>
<Target Name="EmbedLocal" BeforeTargets="ResolveReferences" Condition=" '$(EmbedLocalReferences)' == 'True' ">
<Message Text="Run EmbedLocal for $(MSBuildProjectFullPath)..." Importance="high"/>
<ItemGroup>
<EmbeddedResource Include="@(ReferenceCopyLocalPaths->WithMetadataValue( 'Extension', '.dll' )->Metadata( 'FullPath' ))">
<LogicalName>%(ReferenceCopyLocalPaths.Filename)%(ReferenceCopyLocalPaths.Extension)</LogicalName>
</EmbeddedResource>
</ItemGroup>
<Message Text="Embed local references complete for $(OutputPath)$(TargetFileName)." Importance="high" /> …Run Code Online (Sandbox Code Playgroud) 我有一个 .NET Standard 项目,我在其中为 ASP.NET Core CMS 框架实现了一个模块。目前,它使用来自 NuGet 包的 CMS 框架库。如果我从 GitHub 获取 CMS 框架的源代码并将我的模块添加到其解决方案并将包引用替换为实际项目引用,它将正常工作。
我的目标是在不更新 csproj 文件中的引用的情况下使其工作,因此如果将项目添加到完整源代码解决方案中,则使用项目引用,否则使用 NuGet 包引用。
因此,假设 .NET Standard 项目称为“ModuleA”。它有一个对“ModuleB”的包引用:
<ItemGroup>
<PackageReference Include="ModuleB" Version="1.0.0" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
当我想在 ModuleB 可访问的解决方案中使用 ModuleA 时,我使用项目引用它:
<ItemGroup>
<ProjectReference Include="..\..\ModuleB\ModuleB.csproj" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
我想以某种方式将它们都包含在 .csproj 文件中,并使其在构建时使用正确的引用(例如,基于某些条件,如项目存在?)。
如果两者都添加到 csproj 中,则构建将失败(例如“无法找到项目 ...ModuleB.csproj。检查项目引用是否有效并且该项目文件是否存在。”)。
csproj ×10
c# ×6
msbuild ×5
.net-core ×3
.net ×1
asp.net-core ×1
bond ×1
dotnet-cli ×1
msbuild-15 ×1
msdeploy ×1
rhel ×1
tfs ×1
tfsbuild ×1
wpf ×1