11

我正在尝试通过添加以下内容来设置我的 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) 移到列表的第一位,但这并没有帮助。

4

2 回答 2

19

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

    <Target Name="BeforeResolveReferences">
<CreateProperty
    Value="..\Dependencies\VS2012TestAssemblies;$(AssemblySearchPaths)">
    <Output TaskParameter="Value"
        PropertyName="AssemblySearchPaths" />
</CreateProperty>
</Target>
于 2013-10-18T18:29:58.647 回答
0

似乎最近有一个修复因此这也有效:

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

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

Visual Studio - 参考管理器


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

<?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>
于 2020-01-23T17:20:38.270 回答