天道酬勤,学无止境

Can't find xsd.exe in the path during MSBuild Community Tasks BeforeBuild step in Visual Studio

I am using MSBuild Community Tasks to run Xsd.exe as part of my build in Visual Studio as thus:

<Import Project="$(SolutionDir)Common.targets" />
<PropertyGroup>
  <MSBuildCommunityTasksPath>$(SolutionDir)TeamBuildTypes</MSBuildCommunityTasksPath>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" />
<UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)$(CPPTasks)" />
<Target Name="BeforeBuild">
  <!--Exec Command="'$(DevEnvDir)..\Tools\vsvars32.bat'" /-->
  <XSD Sources="MySchema.xsd" GenerateFromSchema="classes" Language="CS" />
</Target>

Common.targets is as per here.

However, I get the following error during build:

The "XSD" task failed unexpectedly.

Microsoft.Build.Shared.InternalErrorException: MSB0001: Internal MSBuild Error: xsd.exe unexpectedly not a rooted path

A solution has been given on MSDN forum here, which is to add a path to xsd.exe to the path environment variable. But, as indicated by Pico Ohms' answer, this is not maintainable as it is version-dependent and requires every dev to perform an extra step in order to build, just because of Xsd.exe.

I found another solution here which is to call vsvars32.bat beforehand. This is the commented-out line in the code above. This didn't work, so I found a solution here that I hoped would make it work, which was to call DEVENV with the /useenv parameter.

Then I found another solution here which is to add <xs:include schemaLocation="MSBuild\MSBuild.Community.Tasks.xsd"/> to Microsoft.Build.xsd. Didn't work either.

So, now I'm out of ideas. How do I get the MSBuild Community Tasks XSD task working without requiring devs to update their path variable, either by using the /useenv solution, or some other solution? I'm aware I can put xsd.exe in the Visual Studio solution, but this seems like a cheap workaround to me.

评论

I had to do some research to remember the comment I posted on the other thread about this, but you can implement a custom search path for your task by deriving from the XSD task and overriding the GenerateFullPathToTool() method.

When you look at the XSD task in DotPeek you can see it derives from Microsoft.Build.Utilities.ToolTask. ToolTask contains a method called "GenerateFullPathToTool()". This method is called to return the full path to the tool as its name implies.

The ToolLocationHelper in Microsoft.Build.Utilities class can be used to find the appropriate location for your installed xsd.exe.

It contains a method called GetPathToDotNetFrameworkSdkFile which will give you the location of fileName for the dot net sdk. Put "xsd.exe" as the parameter and you should be good to go.

If that method doesn't return the path you need, there are other methods for returning the various paths and its based off of the registry so its more portable than setting an explicit path.

A solution for this that I have been using for many years is to use an inline task to set the path within the project file.

 <ItemGroup>   
    <!-- Configure XSD files by using the XsdClasses custom item type.  All files of this type are converted by the GenerateXsdClasses target. --> 
    <XsdClasses Include="Data\XsdFile1.xsd">
      <SubType>Designer</SubType>
    </XsdClasses>
     <XsdClasses Include="Data\XsdFile2.xsd">
      <SubType>Designer</SubType>
    </XsdClasses>
  </ItemGroup>


  <!-- In-line task to add a folder to the current path if not already in it. -->
  <UsingTask TaskName="AddToPath" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
      <FolderPath ParameterType="System.String" Required="true" />
    </ParameterGroup>

    <Task>
      <Code Type="Fragment" Language="c#"><![CDATA[
            const string PathEnvironmentVariableName = "PATH";
            string currentPath = Environment.GetEnvironmentVariable(PathEnvironmentVariableName);
            if(!currentPath.ToLower().Contains(FolderPath.ToLower()))
            {
                currentPath = currentPath.TrimEnd(';');
                string newPath = string.Format("{0};{1}", currentPath, FolderPath);
                Environment.SetEnvironmentVariable(PathEnvironmentVariableName, newPath);
            }
]]></Code>
    </Task>   
  </UsingTask>

  <!-- Reference the Xsd task. -->
  <UsingTask TaskName="XSD" AssemblyFile="$(VCTargetsPath)Microsoft.Build.CppTasks.Common.dll" />

  <!-- Set the default path to Xsd.exe - this will be added to the current path using the above inline task.  Can be overridden per client by setting a user or machine environment variable with the same name. -->
  <PropertyGroup>
    <NetFxToolsPath Condition="'$(NetFxToolsPath)' == ''">C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7 Tools\</NetFxToolsPath>
  </PropertyGroup>


  <!-- Generate classes from xsd files configured with 'XsdClasses' item type. -->
  <Target Name="GenerateXsdClasses" Inputs="@(XsdClasses)" Outputs="@(XsdClasses->'%(RelativeDir)%(Filename).cs')">
    <Message Importance="high" Text="Building %(XsdClasses.Filename)" />
    <AddToPath FolderPath="$(NetFxToolsPath)" />
    <!-- Note the trailing . in the outputdir because the folder ends with a / -->
    <XSD MinimalRebuildFromTracking="true" Sources="%(XsdClasses.Identity)" GenerateFromSchema="classes" Namespace="XsdClassesNamespace" SuppressStartupBanner="true" AdditionalOptions="/outputdir:&quot;%(XsdClasses.RelativeDir).&quot;" />
  </Target>

  <!-- Configure class generation from xsd to occur before build. -->
  <Target Name="BeforeBuild" DependsOnTargets="GenerateXsdClasses"/>

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在C#项目中使用XSD Build任务(Use XSD Build task in c# project)
    问题 如何在ac#项目中使用c ++ XSD任务? 我已经在csproj文件中创建了任务,如下所示: <Target Name="BeforeBuild"> <XSD Namespace="$(RootNamespace).Xml" Language="CS" GenerateFromSchema="classes" Sources="Xml/schema.xsd" /> </Target> 但是构建输出显示,尽管intellisense在编辑项目文件时为我提供了XSD任务: Error 1 The "XSD" task was not found. Check the following: 1.) The name of the task in the project file is the same as the name of the task class. 2.) The task class is "public" and implements the Microsoft.Build.Framework.ITask interface. 3.) The task is correctly declared with <UsingTask> in the project file, or in the *.tasks files located in the "C
  • 如何使用 AssemblyInfoTask 更改程序集版本号?(How to change Assembly Version Number using AssemblyInfoTask?)
    问题 我试图自动化为所有 DLL 设置版本的过程,在花了一些时间之后,我开始了解最有可能实现它的AssemblyInfo任务。 所以我继续安装它,特别是版本1.0.51130.0 。 安装后,我在.cspoj文件中手动添加了AssemblyInfoTask的Import Tag(通过卸载每个项目)(该解决方案有超过35个proj文件)。 <Import Project="$(MSBuildExtensionsPath)\Microsoft\AssemblyInfoTask\Microsoft.VersionNumber.Targets"/> 接下来我修改了将安装在路径中的Microsoft.VersionNUmber.Target文件: C:\Program Files\MSBuild\Microsoft\AssemblyInfoTask ,我修改了以下部分: <!-- Properties for controlling the Assembly Version --> <PropertyGroup> <AssemblyMajorVersion>4</AssemblyMajorVersion> <AssemblyMinorVersion>0</AssemblyMinorVersion> <AssemblyBuildNumber></AssemblyBuildNumber>
  • TeamCity + WiX + MSBuild workflow suggestions needed
    I've been working on the next step of my continuous integration project, which is to get TeamCity to build my application, automatically change the version number of all assemblies, and then create an installer. A little background first: I've been running TeamCity successfully for the past several months, and it builds my configurations and runs my NUnit and NCover tests just fine. I took a little time researching installers -- I have always hated InstallShield and never considered it for my current application. I like NSIS, but then happened to come across WiX. I don't have any intimate
  • 我应该如何在 msbuild 脚本中引用 sn.exe?(How should I reference sn.exe in msbuild script?)
    问题 我需要在构建完成后重新签署我的程序集(并且我已经对它做了一些其他的事情),所以我开始添加一个名为C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe的<Exec>任务C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe 。 这必须适用于其他开发人员/环境,所以我希望我可以从该文件夹中复制sn.exe和sn.exe.config并将其存储在我们的代码存储库中,以便我始终可以从已知版本调用它的通用版本地点。 sn.exe在 sdk 目录之外sn.exe崩溃,所以我想知道如何在不知道它将位于什么路径下的情况下引用它。 不同的人有不同的环境(x86 与 x64,不同的安装目录,不同的版本),所以我希望能够轻松引用该工具的最新版本(或者任何版本)。 似乎是一个足够简单的工具,也许还有另一种方法可以使用另一个工具/命令/msbuild 任务对程序集进行签名? 任何帮助,将不胜感激。 回答1 要以适合大多数人的方式在 msbuild 脚本中正确引用sn或sqlmetal (我所追求的)之类的工具,您必须考虑操作环境和框架实现的不同方面。 主要有两种情况:Microsoft
  • 需要 TeamCity + WiX + MSBuild 工作流程建议(TeamCity + WiX + MSBuild workflow suggestions needed)
    问题 我一直在做我的持续集成项目的下一步工作,即让 TeamCity 构建我的应用程序,自动更改所有程序集的版本号,然后创建一个安装程序。 先介绍一下背景: 在过去的几个月里,我一直在成功运行 TeamCity,它构建了我的配置并运行了我的 NUnit 和 NCover 测试。 我花了一点时间研究安装程序——我一直讨厌 InstallShield,从来没有考虑过将它用于我当前的应用程序。 我喜欢 NSIS,但后来碰巧遇到了 WiX。 我对 MS 安装程序架构没有任何深入了解,我知道这对于复杂的项目是危险的,所以在某些时候我需要了解更多关于它的信息。 然而,经过几天的 SO 问题、谷歌搜索和阅读博客,我有一个 WiX 项目,它成功地构建、安装、运行应用程序,并且一切都卸载干净。 伟大的! 我还想让 TeamCity 构建配置自动更新我所有程序集的版本号。 通过在我的开发机器上安装 MSBuild Community Tasks,并创建一个使用 BeforeBuild 目标和 FileUpdate 任务来更改版本号的部署配置,我能够模拟这个功能。 这工作正常,除了在我的开发机器上,我没有 build_vcs_number_1 环境变量来替代。 所以这就是我现在的位置——我需要让 TeamCity 进行更新,虽然它确实有 build_vcs_number_1 环境变量,但我不知道如何获得
  • MSBuild: Ensure a target is run before any other build steps
    I am trying to have the AssemblyInfo.cs file updated to reflect the next Publish version of the project BEFORE any other build steps occur. in my project file i added before the end: <Import Project="$(ProjectDir)Properties\PublishVersion.proj" /> PublishVersion.proj looks like this: <?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/> <Target Name=
  • MS-Build BeforeBuild无法启动(MS-Build BeforeBuild not firing)
    问题 我正在自定义.csproj项目,以在主版本之前运行一些自定义任务。 但是,我根本无法执行任务。 我取消了.csproj文件中<Target Name="BeforeBuild" />元素的注释,并添加了一个简单的Message任务,但是在构建时,该消息未出现在我的输出中,因此该任务似乎没有运行。 因此,此片段不会输出消息。 清单1:未显示任何消息 <Target Name="BeforeBuild"> <Message Text="About to build ORM layer" Importance="normal" /> </Target> 但是,如果我拧紧了某些属性,则可以使.csproj根本无法执行;否则,可能会失败。 清单2:一个MSBuild配置错误 <Target Name="BeforeBuild"> <Message Text="About to build ORM layer" XXImportance="normal" /> </Target> 注意XXImportance属性。 我得到的构建错误是 My.csproj(83,46): error MSB4064: The "XXImportance" parameter is not supported by the "Message" task. Verify the parameter
  • 如何在.NET ClickOnce应用程序中将发布版本同步到程序集版本?(How to synchronise the publish version to the assembly version in a .NET ClickOnce application?)
    问题 在我的C#ClickOnce应用程序中,“项目”->“属性” ->“发布”选项卡中有一个自动递增的发布版本。 我想在菜单“帮助” ->“关于”框中显示该版本,但是我使用的代码显然访问了程序集“版本”,这是不同的。 可以在项目->属性->应用程序->装配信息对话框中手动更改装配版本。 因此,就目前而言,每次发布之前,我都会将发布版本复制到程序集版本,因此我的对话框将显示应用程序的当前版本。 必须有更好的方法来做到这一点。 我真正想要做的就是拥有一个准确的,自动更新的,可访问代码的版本号。 这是我用来访问程序集版本号的代码: public string AssemblyVersion { get { return Assembly.GetExecutingAssembly().GetName().Version.ToString(); } } 一种替代方法是找到访问发布版本的代码。 回答1 根据我的经验,sylvanaar的最后一行看起来像是要走的路。 但要注意的是,它仅适用于应用程序的已部署版本。 出于调试目的,您可能需要类似以下内容: static internal string GetVersion() { if (ApplicationDeployment.IsNetworkDeployed) { return ApplicationDeployment
  • 构建服务器上的基础设施组件(Infragistics components on build server)
    问题 我已经“继承”了一个新的(旧的?)Winforms 项目,并想把它放到我们的构建服务器(Bamboo)上。 该构建服务器仅安装了绝对最低限度(.NET 3.5 和更多),我们希望保持这种状态。 作为第一步,我将 Infragistics 组件的所有程序集文件 (*.dll) 提取到一个单独的目录中,并从该本地目录中引用它们(而不是依赖它们安装在 GAC 中)。 工作正常。 但是当我尝试在 Bamboo 上运行这个构建(使用 MSBuild)时,我不断收到错误: Properties\licenses.licx(1): 错误 LC0004: 创建类型 'Infragistics.Win.UltraWinToolbars.UltraToolbarsManager, Infragistics2.Win.UltraWinToolbars.v7.2, Version=7.2.20072.61, Culture=neutral, SystemKey30c30c30c30cfc 时发生异常.ComponentModel.LicenseException 经过一番谷歌搜索,项目中的那些licenses.licx文件似乎是某种许可方案,以防止将工具安装在多台机器上。 但是我怎样才能摆脱这些,以便我的构建服务器构建可以工作,而无需将完整的 Infragistics 组件集安装到构建服务器上
  • MSBuild TFS Build Number
    I have been using SVN for a little while now. recently on a project I am using TFS. With the builds I like to append/update the build version number on the project output. I do this on the masterpage so that it is clearly visible on the application. Since the application could be running on multiple machines, it is handy information on which verison are running. I achive this in SVN world as: <!-- Import of the MSBuildCommunityTask targets --> <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> <!-- to AssemblyInfo to include svn revision number
  • TeamCity的装配版本控制(Assembly Versioning with TeamCity)
    问题 我正在使用SVN和TeamCity构建服务器的C#/ VB.Net项目中工作。 该版本生成了十几个程序集。 我想控制程序集的版本,以便它们全部匹配并且也与TeamCity构建标签匹配。 我已将TeamCity配置为使用的构建标签 Major.Minor。{Build}。{Revision} 其中Major和Minor是我手动设置的常量,{Revision}由结帐时的SVN存储库版本确定,而{Build}是TeamCity自动递增的构建计数器。 因此,示例构建标签为 2.5.437.4423 您将建议采用什么技术来确保所有程序集版本都与TeamCity构建标签匹配? 回答1 我们正在使用CruiseControl.net和SVN。 我们以其他方式驱动它。 我们在MSBuild脚本中使用MSBuildCommunityTasks Version任务来增加CI构建的版本号,并使用该版本号标记源代码。 编辑:要求有关MSBuild目标的更多详细信息... 我们使用一个单独的脚本用于CI构建,而不用于开发人员构建。 我们尝试在Studio用作项目文件的MSBuild文件中使用不同的目标,但这令人头疼,需要手动编辑Studio生成的文件。 MSBuild文件的结构非常简单: 导入多余的零件<Import Project="$(MSBuildExtensionsPath)
  • MS-Build BeforeBuild not firing
    I'm customising a .csproj project to run some custom tasks before the main build. However, I can't get the tasks to execute at all. I uncommented the <Target Name="BeforeBuild" /> element in the .csproj file and added a simple Message task, but when I build, the message doesn't appear in my output, so it seems the task isn't running. So this fragment does not output the message; Listing 1: No Message Appears <Target Name="BeforeBuild"> <Message Text="About to build ORM layer" Importance="normal" /> </Target> However, if I screw with some of the attributes, I can get the .csproj to fail to
  • MSBuild TFS 内部版本号(MSBuild TFS Build Number)
    问题 我已经使用 SVN 一段时间了。 最近在一个项目中我正在使用 TFS。 对于构建,我喜欢在项目输出中附加/更新构建版本号。 我在母版页上这样做,以便它在应用程序上清晰可见。 由于应用程序可以在多台机器上运行,因此它是有关正在运行的版本的方便信息。 我在 SVN 世界中实现了这一点: <!-- Import of the MSBuildCommunityTask targets --> <Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" /> <!-- to AssemblyInfo to include svn revision number --> <Target Name="BeforeBuild"> <SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(ProgramFiles)\CollabNet Subversion Client"> <Output TaskParameter="Revision" PropertyName="Revision" /> </SvnVersion> <Time> <Output TaskParameter="Year"
  • 如何从另一个具有相对文件路径的msbuild项目中导入msbuildcommunitytasks项目?(How do I import the msbuildcommunitytasks project from another msbuild project with a relative file path?)
    问题 请放轻松,我是msbuild和msbuildtasks的新手! 如何设置一个属性,该属性表示要导入的目标文件的相对文件路径? 我需要相对的参考,因此它可以在所有开发机上使用。 但是导入目标正在尝试在内部使用相对文件路径,因为它相对于导入目标进行了重新评估,因此将无法正常工作! 有效地,我正在尝试解决已记录的导入项目的行为: 导入项目中的所有相对路径都相对于导入项目的目录进行解释。 因此,如果将一个项目文件导入到不同位置的多个项目文件中,则对于每个导入的项目,导入的项目文件中的相对路径将被不同地解释。 回答1 是否有可能在没有安装的情况下使用MSBuild Extension Pack? 问题是如何对MSBuild扩展包执行相同的操作,两者在这方面都是相似的。 对于扩展包,您必须声明属性ExtensionTasksPath ,对于社区任务,必须声明类似的属性MSBuildCommunityTasksLib 。 因此,在您的情况下,它应如下所示: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <MSBuildCommunityTasksLib Condition="'$(MSBuildCommunityTasksLib)' == ''">E:\Data
  • MSBuild BeforeBuild 步骤(MSBuild BeforeBuild Step)
    问题 我昨天询问了让AfterBuild工作的问题,并且能够通过将它放在“ Project部分的最底部来使其Project :MSBuild AfterBuild Step 我在不同的项目中尝试了完全相同的事情。 这是我的BeforeBuild代码: <Target Name="BeforeBuild"> <Message Text="###HI###" Importance="High" /> </Target> 我在项目中的Target Name="BeforeBuild"之前没有另一个,我把它放在Project部分的最底部。 .vcxproj 可以毫无问题地解析/加载到 Visual Studio 2010 中。 我将“MSBuild 项目构建输出/日志详细信息”设置为“正常”。 还有其他我没有想到的事情会导致它无法运行吗? 回答1 除非明确调用,否则不会调用目标,它是默认目标,在被调用的目标的 DependsOn 中声明或声明其自己的 BeforeTargets 或 AfterTargets 并且这些目标之一被调用。 因此,如果您希望在名为“InitializeBuildStatus”的目标之前调用目标,则可以这样编写: <Target Name="MyBeforeBuild" BeforeTargets="InitializeBuildStatus"> <Message
  • 编程定义:什么是“建筑物”。(Programming Definitions: What exactly is 'Building'.)
    问题 构建解决方案/项目/程序意味着什么? 我想确保自己的定义正确(所以在交谈时我听起来不像是个白痴)。 在IDE的,你可以(纠正我,如果我错了)编译源代码/编程码成计算机可读的机器代码。 您可以调试程序,这基本上是逐步执行该程序并查找错误。 但是,构建程序到底能做什么? 在VS中,我知道在构建程序时会在调试文件夹中生成一个可执行文件。 关于构建程序意味着什么的硬核技术定义? 回答1 这不一定涉及人类对“构建”的含义,但是就MSBuild 2.0而言,Microsoft.Common.targets中的代码因此对其进行了描述: ... <!-- ============================================================ Build The main build entry point. ============================================================ --> <PropertyGroup> <BuildDependsOn> BeforeBuild; CoreBuild; AfterBuild </BuildDependsOn> </PropertyGroup> <Target Name="Build" Condition=" '$(
  • 如何通过我们的CI平台(哈德森)自动递增C#程序集版本?(How can I auto increment the C# assembly version via our CI platform (Hudson)?)
    问题 我本人和我的小组在增加程序集版本号时都感到非常恐惧,我们经常以1.0.0.0版本发布程序集。 显然,这会引起很多头痛。 通过我们的CI平台,我们的做法越来越好,我真的想将其设置为自动递增assemblyinfo.cs文件中的值,以便我们的程序集版本会随着代码更改而自动更新。那个集会。 我之前曾设置过(在找到Hudson之前)通过msbuild或命令行(不记得了)来增加值的方法,但是有了Hudson,它将更新SVN存储库并触发ANOTHER构建。 当Hudson每小时轮询SVN时,这将导致缓慢的无限循环。 让Hudson增加版本号是个坏主意吗? 什么是替代方法呢? 理想情况下,我的解决方案标准是: 生成之前,在assemblyinfo.cs增加生成号仅增加已更改的部件中的内部版本号。 这可能是不可能的,因为Hudson每次进行构建时都会擦除项目文件夹将更改后的assemblyinfo.cs提交到代码存储库(当前为VisualSVN) 不会导致Hudson在下次扫描更改时触发新的构建 在脑海中解决这个问题,我可以很容易地通过批处理文件/命令提出解决方案,但是我的所有想法都会导致Hudson在下次扫描时触发新的构建。 我并不是在寻找某人为我做任何事情,只是为我指明了正确的方向,也许是让哈德森忽略某些SVN提交的技术,等等。 到目前为止,我发现的所有内容仅是一篇文章
  • MSBuild BeforeBuild Step
    I asked yesterday about getting AfterBuild working and was able to get that working by placing it at the very bottom of the Project section: MSBuild AfterBuild Step I have tried the exact same thing with a different project. This is my BeforeBuild code: <Target Name="BeforeBuild"> <Message Text="###HI###" Importance="High" /> </Target> I don't have another before Target Name="BeforeBuild" in the project and I have this placed at the very bottom of the Project section. The .vcxproj is parsing/loading into Visual Studio 2010 without issue. I have my "MSBuild project build output/log verbocity"
  • 本地化 AssemblyInfo.cs(Localize AssemblyInfo.cs)
    问题 我的 AssemblyInfo 包含有关我的产品、公司等的信息。这些数据目前硬编码在 cs 文件中: [assembly: AssemblyCompany("My Company.")] [assembly: AssemblyProduct("MyProduct")] [assembly: AssemblyCopyright("Copyright © 2012 My Company, Inc. All Rights Reserved.")] [assembly: AssemblyTrademark("MyProduct is a trademark of MyCompany Software.")] [assembly: AssemblyCulture("")] 我想本地化这些文本,但我无法执行以下操作: [assembly: AssemblyCompany(Resources.MyConpany)] 有没有解决的办法 ? 回答1 是的,这是可能的。 这些属性本身很少被关心语言的人阅读。 然而,C# 编译器也使用它们来生成 /win32res 编译选项的默认版本。 这会影响您在资源管理器中查看程序集属性时看到的内容,使用“属性”快捷菜单项并查看“详细信息”选项卡。 Windows 在这里显示的不是程序集属性,它对托管程序集一无所知。
  • MSBuild 社区任务文档 [关闭](MSBuild Community Tasks Documentation [closed])
    问题 关闭。 此问题不符合 Stack Overflow 准则。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其成为 Stack Overflow 的主题。 3年前关闭。 改进这个问题 是我一个人还是这个项目的文档真的很稀缺? 我正在尝试寻找一般情况下如何使用 FtpCreateRemoteDirectory 和 FTP 功能,但似乎找不到任何东西。 Googling FtpCreateRemoteDirectory,只显示项目的源代码... 回答1 文档就像你说的非常稀缺。 我发现最好的是在这里下载最新的源代码:https://github.com/loresoft/msbuildtasks 最新文档也可以直接通过GitHub查看,无需下载源码:https://github.com/loresoft/msbuildtasks/tree/master/Documentation 如果使用 MSI 安装,您还可以查看安装文件夹 (C:\Program Files (x86)\MSBuild\MSBuildCommunityTasks\MSBuild.Community.Tasks.xsd) 中的 XSD 以至少查看哪些任务可供您使用以及与它们相关的文档。 回答2 Github 上的最新版本不包括文档(问题 #24)。 Tigris 上的旧版本确实包含 CHM 文件形式的文档