Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用MSBuild将链接文件添加到csproj文件。(3.5框架)_C#_.net_Xml_Build_Msbuild - Fatal编程技术网

C# 如何使用MSBuild将链接文件添加到csproj文件。(3.5框架)

C# 如何使用MSBuild将链接文件添加到csproj文件。(3.5框架),c#,.net,xml,build,msbuild,C#,.net,Xml,Build,Msbuild,我正在尝试使用MSBuild将链接文件添加到我的.csproj文件中 这是.NETFramework 3.5(而不是4.0)。我提到这一点是因为我看到一些4.0特定的东西试图操纵XML 以下是我的开始: <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> <ItemGroup> <Re

我正在尝试使用MSBuild将链接文件添加到我的
.csproj
文件中

这是.NETFramework 3.5(而不是4.0)。我提到这一点是因为我看到一些4.0特定的东西试图操纵XML

以下是我的开始:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core">
      <RequiredTargetFramework>3.5</RequiredTargetFramework>
    </Reference>
    <Reference Include="System.Data" />
    <Reference Include="System.Xml" />
  </ItemGroup>

  <ItemGroup>
    <Compile Include="MySuperCoolClass.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
  </ItemGroup>

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />

</Project>

3.5
这就是我想要得到的:

   <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
      <ItemGroup>
        <Reference Include="System" />
        <Reference Include="System.Core">
          <RequiredTargetFramework>3.5</RequiredTargetFramework>
        </Reference>
        <Reference Include="System.Data" />
        <Reference Include="System.Xml" />
      </ItemGroup>

      <ItemGroup>
        <Compile Include="MySuperCoolClass.cs" />
        <Compile Include="Properties\AssemblyInfo.cs" />
      </ItemGroup>


      <ItemGroup>
        <Content Include="..\..\SomeFunFolder\MyLinkFile.ext">
          <Link>MyLinkFile.ext</Link>
        </Content>
      </ItemGroup>    

      <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
    </Project>  

3.5
MyLinkFile.ext
我有:

  • MSBuild.Community.Tasks.dll

  • MSBuild.ExtensionPack.dll
可用

有具体的帮助吗

像使用“MSBuild.ExtensionPack.Xml.XmlFile”这样的一行注释没有帮助


但我非常欣赏任何指针或编码示例。

您使用以下内容是否可行

using System;
using System.Text;
using Microsoft.Build.BuildEngine;

namespace ConsoleApplication11
{
    class Program
    {
        static void Main(string[] args)
        {
            var fullPathName = @"PathToProjectFile\Project.csproj";

            Project project = new Project();
            project.Load(fullPathName);

            var itemGroup = project.AddNewItemGroup();

            var buildItem = itemGroup.AddNewItem("Content", @"..\..\SomeFunFolder\MyLinkFile.ext");
            buildItem.SetMetadata("Link", "MyLinkFile.ext");
            project.Save(fullPathName, Encoding.UTF8);
        }
    }
}

我打开了“MSBuild.ExtensionPack.Xml.XmlFile(.cs)”的代码并四处查看。 谢天谢地,开源

我明白了…你必须“建立它”。 我不得不添加一个巫毒小把戏(下面是“MyUniqueKeyHelper123”)

我会在这里发帖。 如果您在使用“MSBuild.ExtensionPack.Xml.XmlFile(.cs)”时遇到问题,请获取源代码并查看它。您可以通过查看该方法了解如何设置属性。 一开始有点棘手,但我能理解

<PropertyGroup>
    <MSBuildExtensionPackPath Condition="'$(MSBuildExtensionPackPath)' == ''">.\ExtensionPackFiles</MSBuildExtensionPackPath>
    <MSBuildExtensionPackLib>$(MSBuildExtensionPackPath)\MSBuild.ExtensionPack.dll</MSBuildExtensionPackLib>
</PropertyGroup>    


<UsingTask AssemblyFile="$(MSBuildExtensionPackLib)" TaskName="MSBuild.ExtensionPack.Xml.XmlFile" />


<Target Name="XmlTest01Target">

    <Message Text="MSBuildExtensionPackLib = $(MSBuildExtensionPackLib)" />

    <!--

    The goal is:

    <ItemGroup>
    <Content Include="..\..\SomeFunFolder\MyLinkFile.ext">
    <Link>MyLinkFile.ext</Link>
    </Content>
    </ItemGroup>    

    -->

    <!-- Define a custom namespace.  I used "peanut" just to show it is any name you give it  -->

    <ItemGroup>
        <Namespaces Include="Mynamespace">
            <Prefix>peanut</Prefix>
            <Uri>http://schemas.microsoft.com/developer/msbuild/2003</Uri>
        </Namespaces>       
    </ItemGroup>

    <!-- 
        Add the <ItemGroup> (new) Element.  HOWEVER, since there will probably be multiple <ItemGroup> nodes, tag it with some unique identifier.  Will Clean up later.
    -->
    <XmlFile 
        TaskAction="AddElement" 
                    Namespaces="@(Namespaces)" 
                 File=".\MyCSharpProjectFile.csproj"
                 Element="ItemGroup"
                 Key="MyUniqueKeyHelper123"
                 Value ="MyUniqueValueHelper123"
                 XPath="//peanut:Project" 
        />

    <!-- 
        Add the <Content> (new) Element.  With Attribute Value.
    -->         
    <XmlFile 
        TaskAction="AddElement" 
                 File=".\MyCSharpProjectFile.csproj"
                 Element="Content"
                 Key="Include"
                 Value ="..\..\SomeFunFolder\MyLinkFile.ext"
                                Namespaces="@(Namespaces)" 
                 XPath="//peanut:Project/peanut:ItemGroup[@MyUniqueKeyHelper123='MyUniqueValueHelper123']" 
        />

    <!-- 
        Add the <Content> (new) Element.  With Element Value Value.
    -->                 
    <XmlFile 
        TaskAction="AddElement" 
                 File=".\MyCSharpProjectFile.csproj"
                 Element="Link"
                 InnerText ="MyLinkFile.ext"
                    Namespaces="@(Namespaces)" 
                 XPath="//peanut:Project/peanut:ItemGroup[@MyUniqueKeyHelper123='MyUniqueValueHelper123']" 
        />

    <!-- 
        Clean up the "unique" attribute to leave clean xml.
    -->             
    <XmlFile 
        TaskAction="RemoveAttribute" 
                 File=".\MyCSharpProjectFile.csproj"
                 Element="Link"
                 Key="MyUniqueKeyHelper123"
                    Namespaces="@(Namespaces)" 
                 XPath="//peanut:Project/peanut:ItemGroup[@MyUniqueKeyHelper123='MyUniqueValueHelper123']" 
        />

</Target>

扩展包文件
$(MSBuildExtensionPackPath)\MSBuild.ExtensionPack.dll
花生
http://schemas.microsoft.com/developer/msbuild/2003

好吧,如果我编写了一个自定义的MSBuild任务(我在过去已经做了好几次),那么“超出了限制”。我希望在正常的.msbuild文件逻辑中执行此操作,而无需自定义任务。我非常感谢你的意见。