标签: project-reference

通过dll引用而不是VS中的项目引用来管理.NET程序集依赖项

我们有一个由多个子项目组成的.NET项目(大约20个).有几种解决方案,每种解决方案仅包含与特定解决方案相关的子项目.

为了允许任意解决方案,我们的子项目从不通过项目引用相互引用,而是通过直接dll引用.csproj文件几乎没有调整,使HintPath包含$(Configuration),因此Debug构建引用Debug dlls和Release构建引用版本dll.

一切都很好,但有两个主要问题 - 一个是烦人的,另一个是非常严重的:

  1. VS不会为依赖项计算识别dll引用.每次添加新项目或引用时,我们必须使用"项目依赖项"对话框手动指定依赖项.这很烦人.
  2. 我们既不使用Resharper也不使用Visual Assist(很棒的工具,但我们不使用它们,它是给定的).我们喜欢使用标准的"浏览到定义"命令(例如,可从源代码的上下文菜单中获得).严重的问题是,如果一个项目使用项目引用引用另一个项目,它只能跨项目工作,并且当引用是直接dll引用时它不起作用,即使引用的项目包含在解决方案中!这真是一个真正的无赖,因为它不是导航到源,而是导航到元数据.

我正在寻求那些使用像我们这样的dll引用并且以某种方式克服这两个问题的那些人的建议.谢谢.

编辑:

请注意,除了"浏览到定义"问题之外,使用Dll引用而不是项目引用只会在项目管理器上产生一次时间成本 - 即在添加新项目时更新每个受影响的解决方案的项目依赖项或新的依赖项必须介绍.这些项目依赖项保存在.sln文件中,在新项目到达或创建新依赖项之前不需要任何维护,这种情况不常发生.

我们使用msbuild在CI服务器上构建项目,CI服务器使用与VS相同的.sln文件.有一个主要的.sln文件,其中包含所有子项目.

我想强调一个更尖锐的问题 - 无法浏览另一个项目中的定义,尽管两个项目都在同一个解决方案中,因为引用是dll引用.这很烦人,这是一个麻烦,没有理由为什么VS坚持项目参考启用该功能.其他工具,如Resharper或Visual Assist没有此限制.唉,我们没有这些工具,也不太可能在可观察的未来.

.net project-reference visual-studio-2008

9
推荐指数
2
解决办法
2583
查看次数

Visual Studio 2010 DTE:如何使添加的DLL引用绝对而不是复制

摘要:

当您添加特定DLL时,我们需要使用DTE复制"添加引用"对话框的行为(它将Hint路径条目添加到CSProj文件中的引用).

**注意:此处有另一篇相关但未重复的帖子:https://stackoverflow.com/questions/6690655/visual-studio-2010-add-in-how-to-get-a-references-提示路径属性请阅读该提示以获取有关此问题的更多信息.我现在已经添加了一个不错的赏金来得到答案,并且很乐意在任何体面的答案上分散投票:)*

到目前为止的故事:

我正在使用DTE以编程方式将项目引用转换为直接DLL引用.

假设我有一个简单的解决方案Project2(在项目),它引用Project1(该项目),我作出这样的变化:

project1Reference = FindProjectReference(project2.References, project1);
project1Reference.Remove();
Reference dllReference = project2.References.Add(project1DllPath);
Run Code Online (Sandbox Code Playgroud)

其中project1DllPath引用该"c:\somewhere\Project1\Bin\Debug\Project1.dll"文件.

我还不能解决的问题是,新的参考是不是"c:\somewhere\Project1\Bin\Debug\Project1.dll",而是指向 "c:\somewhere\Project2\Bin\Debug\Project1.dll"(文件被复制那里).

如果我使用"添加引用"菜单直接/手动添加DLL,则不会执行此复制.

如何在没有复制和引用它的情况下将DLL引用添加到现有项目的DLL中?

我尝试dllReference.CopyLocal = false;在Add之后添加,但除了设置标志之外没有任何区别.创建后似乎没有选项可以修改路径.

更新:我还尝试以编程方式从Project2中删除Project1上的任何Build依赖项,但这没有任何效果.

以下是csproj文件之间的区别:

作为一个项目:

  <ItemGroup>
    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
      <Project>{86B3E118-2CD1-49E7-A180-C1346EC223B9}</Project>
      <Name>ClassLibrary1</Name>
    </ProjectReference>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

作为DLL引用(路径完全丢失):

 <ItemGroup>
    <Reference Include="ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <Private>False</Private>
    </Reference>
    ...
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

作为手动引用的DLL:

  <ItemGroup>
    <Reference Include="ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
      <HintPath>..\ClassLibrary1\bin\Debug\ClassLibrary1.dll</HintPath>
    </Reference>
    ...
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

看起来能够指定DLL引用的提示路径是关键.如何在DLL引用上设置提示路径(假设您只有Reference属性的句柄)? …

project-reference visual-studio-2010 envdte

8
推荐指数
1
解决办法
8025
查看次数

Ninject程序集与引用的程序集不匹配

建立:

  • ASP.NET MVC3
  • Ninject v2.2.1.4
  • Ninject v3.0.0.15
  • Ninject.MVC3 v3.0.0.6
  • Ninject.Web.Common v3.0.0.7

使用NuGet,我的UnitTest项目引用了Ninject v2.2.1.4

我的Web项目引用了Ninject v3.0.0.15,Ninject.MVC3和Ninject.Web.Common

问题:

随着win explorer在我的web项目的bin文件夹中打开,我构建了我的解决方案,我可以看到Ninject v2.2.1.4被复制到我的web项目的bin目录中.然后被Ninject v3.0.0.15取代.

当我点击F5进行调试时,Ninject.dll v3.0.0.15被Ninject v2.2.1.4取代,导致以下错误:

无法加载文件或程序集'Ninject,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

是什么赋予了?

asp.net ninject project-reference assembly-references nuget

8
推荐指数
1
解决办法
5878
查看次数

XamlParseException:无法加载文件或程序集"ResourceLibrary,..."或其依赖项之一.该系统找不到指定的文件

System.Windows.Markup.XamlParseExceptionoccurred

A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll

Additional information: 'Set property 'System.Windows.ResourceDictionary.Source' threw an exception.' Line number '21' and line position '6'.

"Could not load file or assembly 'ResourceLibrary, Culture=neutral' or one of its dependencies. The system cannot find the file specified.":"ResourceLibrary, Culture=neutral"

=== Pre-bind state information ===
LOG: DisplayName = ResourceLibrary, Culture=neutral
 (Partial)
WRN: Partial binding information was supplied for an assembly:
WRN: Assembly Name: ResourceLibrary, Culture=neutral | Domain ID: 2
WRN: A partial bind …
Run Code Online (Sandbox Code Playgroud)

c# wpf using project-reference visual-studio

8
推荐指数
1
解决办法
6032
查看次数

确定MSBuild中ProjectReference的输出而不触发冗余重建

作为包含许多项目的解决方案的一部分,我有一个引用的项目(通过<ProjectReference>解决方案中的其他三个项目,以及其他一些项目).在AfterBuild,我需要将3个特定依赖项目的输出复制到另一个位置.

通过各种SO答案等,我决定实现这一目标的方式是:

    <MSBuild 
        Projects="@(ProjectReference)" 
        Targets="Build" 
        BuildInParallel="true" 
        Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
        <Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
    </MSBuild>
    <Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />
Run Code Online (Sandbox Code Playgroud)

但是,我遇到了这个问题.该<MSBuild步骤的IncrementalClean任务最终删除了一些输出ProjectC.在VS2008下运行时,如果项目包含此目标,如果我对整个解决方案进行构建,那么build.force存放在obj/DebugProjectC文件夹中的文件将触发ProjectC重建AfterBuild,如果从构建中排除此项目,则[正确] ]不会触发ProjectC的重建(并且重要的是重建ProjectC的所有家属).在这种情况下,这可能是VS特定的技巧,这不会发生在TeamBuild或其他命令行MSBuild调用的上下文中(但最常见的用法是通过VS,所以我需要解决这个问题)

依赖项目(以及一般的解决方案的其余部分)都是与VS交互式创建的,因此ProjectRefences包含相对路径等.我已经看到提到这可能会导致问题 - 但没有完整解释为什么,或者它将被修复或如何解决它.换句话说,我真的不感兴趣,例如ProjectReference通过手动编辑.csproj 将路径转换为绝对路径.

虽然我完全有可能做一些愚蠢的事情,有人会立即指出它是什么(这将是伟大的),请放心,我花了很多时间仔细考虑/v:diag输出等(虽然我没有尝试建立一个repro从从头开始 - 这是在相对复杂的整体构建的背景下)

msbuild project-reference msbuild-task

7
推荐指数
2
解决办法
9311
查看次数

TFSBuild/MSBuild和项目参考与文件参考

我们有一个使用项目引用的大型VS解决方案,它由TFS Build构建,如下所示:

Solution
- Project 1
- Project 2
- Project ...
- Project N
Run Code Online (Sandbox Code Playgroud)

由于解决方案太大,我们有几个较小的解决方案,我们日常使用:

SubSolution
- Project 1
- Project 19
Run Code Online (Sandbox Code Playgroud)

问题是,开发SubSolution的开发人员发现它没有构建,因为找不到项目引用,因此他们将项目更改为使用文件引用.

然后继续打破无法找到这些文件引用的TFS Build,因为它们尚未构建(即使项目在同一解决方案中).两种类型的参考文献之间是否存在解决这种拉锯战的方法.拆分解决方案的正确方法是什么?

msbuild tfs projects-and-solutions project-reference tfsbuild

7
推荐指数
1
解决办法
3928
查看次数

最终编译程序集中.Net中项目和dll依赖项之间的差异

假设我有两个项目A和B. A取决于B.我可以用两种方式指定:

  • 在同一个解决方案中包含A和B,并将B指定为A的项目依赖项.这在A的msbuild项目中显示为"ProjectReference"节点.
  • 包含对B的已编译dll的引用作为A的依赖项.这在A的msbuild项目中显示为"Reference"节点

我的问题是,一旦我为A构建程序集,这两种方法之间的最终输出是否存在差异.

我尝试创建几个简单的项目来模拟这种关系并尝试比较 - 但不同的比较工具告诉我不同​​的东西.在写一些逐字节比较这些文件的东西时,我想知道你们是否对此有所了解.具体来说,如果我使用dll引用而不是项目引用,构建的程序集的行为是否会有任何差异.

.net c# project-reference dll-reference

7
推荐指数
1
解决办法
2362
查看次数

调试后项目引用被删除

我们最近已升级到VS2010(10.0.40219.1 SP1Rel)和ILOG规则.net 7.1.1.4(x64).现在可以发生以下情况:

  1. 打开解决方案.
  2. 调试项目
  3. 停止调试.
  4. 关闭文件(到目前为止:app.Config和Program.cs)
  5. 观看"重构规则"通知窗口出现.
  6. 惊恐万分,因为每个rulep文件的第一个项目引用都被删除了.

这种情况发生在大型解决方案中(大约60个csproj,约15个规则).这种情况发生在较小的解决方案中(6个csproj,1个规则).

我们已经开始采取极端开发措施来避免引用丢失(在调试时卸载所有规则,并在调试后关闭/重新打开VS2010).

我们的项目或软件设置中有什么东西可以改变以阻止项目引用下降吗?


更新:虽然使用调试器是一种可靠的方法来解决"重构规则/引用丢弃"问题,但偶尔也只是通过关闭文件而不使用调试器.


我已经获得了第一笔赏金,如果有人想出一个可以接受的答案,我愿意设立第二笔赏金.


解决方法:我们有三个解决方案文件

  1. 一个解决方案文件,其中包含构建服务器的所有内容.
  2. 一个只包含rulep及其依赖项的解决方案文件.Devs构建了一次以获得规则的.dll.
  3. 不包含rulep项目的解决方案文件.需要rulep的dll的项目具有预构建事件,该事件将dll复制到其文件夹中以及对该位置的程序集引用.允许调试和发布版本都需要一点点摆弄.

开发人员可以安全地调试第三个解决方案,该解决方案没有用于VS的规则文件.

project-reference visual-studio-2010 ilog

7
推荐指数
1
解决办法
478
查看次数

解决不正确的项目引用GUID

我在Visual Studio解决方案中有一些项目,最终的项目引用包含引用项目的错误GUID.(可能是由于引用的项目在某个阶段重新创建)

例如.考虑一个具有以下属性的项目CoreProject.csproj:

<ProjectGuid>{93803F9C-8C65-4949-8D44-AB7A3D0452C8}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>CoreProject</RootNamespace>
<AssemblyName>CoreProject</AssemblyName>
Run Code Online (Sandbox Code Playgroud)

另一个项目包括对此的引用,但在某个阶段GUID已更改,现在不正确.

<ProjectReference Include="..\CoreProject\CoreProject.csproj">
  <Project>{5FD52517-79F8-41D2-B6F2-EA2D8A886549}</Project>
  <Name>CoreProject</Name>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)

解决方案仍然在Visual Studio和msbuild中正确加载和构建,但我怀疑错误的GUID可能会在VS中产生一些性能影响.

解决方案非常庞大,许多项目存在此问题,我不希望手动重新添加这些引用.是否有任何工具或宏可以"修复"项目参考GUID?

msbuild project-reference visual-studio-2010

6
推荐指数
1
解决办法
1784
查看次数

为什么我的项目引用指向"obj"目录中的dll?

我正在为项目添加一个项目引用,它已经添加了一些项目引用.如果我检查现有的属性,它们都有到项目bin目录的路径,例如:

C:\MyProject2\bin\Debug\MyProject2.dll

但是,在添加另一个项目引用时,它最终会有一个指向其obj目录的路径:

C:\MyProject3\obj\Debug\MyProject3.dll

那dll似乎甚至不存在!(虽然这可能是因为我无法将整个解决方案编译好.)

为什么一个项目引用指向bin,另一个指向obj?以及如何纠正它?

c# asp.net project-reference visual-studio-2015

6
推荐指数
1
解决办法
3250
查看次数