【问题标题】:using AssemblySearchPaths in csproj files在 csproj 文件中使用 AssemblySearchPaths
【发布时间】:2013-10-19 01:06:36
【问题描述】:

我正在尝试通过添加以下内容来设置我的 csproj 文件以在父目录中搜索依赖项:

<PropertyGroup>
    <AssemblySearchPaths>
       ..\Dependencies\VS2012TestAssemblies\; $(AssemblySearchPaths)
   </AssemblySearchPaths>
</PropertyGroup>

我将它作为最后一个 PropertyGroup 元素添加到第一个 ItemGroup 之前,它包含所有 Reference 声明。

不幸的是,这导致所有其他引用无法解析,例如:

ResolveAssemblyReferences:
         Primary reference "Microsoft.CSharp".
     9>C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Common.targets(1578,5): warning MSB3245: Could not resolve this reference. Could not locate the assembly "Microsoft.CSharp". Check to make sure the assembly exists on disk. If this reference is required by your code, you may get compilation errors. 
For SearchPath "..\Dependencies\VS2012TestAssemblies\".
                 Considered "..\Dependencies\VS2012TestAssemblies\Microsoft.CSharp.winmd", but it didn't exist.
                 Considered "..\Dependencies\VS2012TestAssemblies\Microsoft.CSharp.dll", but it didn't exist.
                 Considered "..\Dependencies\VS2012TestAssemblies\Microsoft.CSharp.exe", but it didn't exist.

我有没有一种简单的方法可以告诉 msbuild 在哪里搜索我的项目的依赖项?我意识到我可以使用 /p:ReferencePath,但是我更喜欢在 csproj 文件本身中包含编译逻辑,而不是让 TFS Team Builds 指示查看位置,更不用说我希望能够在其他文件上编译它开发者机器。

我确实尝试将 $(AssemblySearchPaths) 移到列表的第一位,但这没有帮助。

【问题讨论】:

    标签: msbuild dependency-management


    【解决方案1】:

    您能否更改目标“BeforeResolveReferences”中“AssemblySearchPaths”属性的值,看看是否能解决您的问题?

        <Target Name="BeforeResolveReferences">
    <CreateProperty
        Value="..\Dependencies\VS2012TestAssemblies;$(AssemblySearchPaths)">
        <Output TaskParameter="Value"
            PropertyName="AssemblySearchPaths" />
    </CreateProperty>
    </Target>
    

    【讨论】:

    【解决方案2】:

    Seems like there was a fix recently 这样也可以:

    <PropertyGroup>
      <ReferencePath>MY_PATH;$(ReferencePath)</ReferencePath>
    </PropertyGroup>
    

    这使得该文件夹中的程序集也显示在“添加引用...”窗口中:)


    由于您也可能不希望将程序集复制到输出文件夹中,因此这里有一个关于如何实现此目的的示例:

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <!-- ... -->
    
      <PropertyGroup>
        <!-- Add paths to ReferencePath. E.g. here it is Unity. -->
        <ReferencePath>C:\Program Files\Unity\Hub\Editor\$(UNITY_VERSION)\Editor\Data\Managed\UnityEngine;$(ReferencePath)</ReferencePath>
      </PropertyGroup>
    
      <Target Name="DontCopyReferencePath" AfterTargets="ResolveAssemblyReferences">
        <!-- Don't copy files indirectly referenced by ReferencePath -->
        <ItemGroup>
          <!-- Collect paths to allow for batching -->
          <ReferencePaths_ Include="$(ReferencePath)" />
          <!-- Use batching to remove all files which should not be copied. -->
          <ReferenceCopyLocalPaths Remove="@(ReferencePaths_ -> '%(Identity)\*.*')" />
        </ItemGroup>
      </Target>
    
      <!-- ... -->
    </Project>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多