我们有一个由多个子项目组成的.NET项目(大约20个).有几种解决方案,每种解决方案仅包含与特定解决方案相关的子项目.
为了允许任意解决方案,我们的子项目从不通过项目引用相互引用,而是通过直接dll引用.csproj文件几乎没有调整,使HintPath包含$(Configuration),因此Debug构建引用Debug dlls和Release构建引用版本dll.
一切都很好,但有两个主要问题 - 一个是烦人的,另一个是非常严重的:
我正在寻求那些使用像我们这样的dll引用并且以某种方式克服这两个问题的那些人的建议.谢谢.
编辑:
请注意,除了"浏览到定义"问题之外,使用Dll引用而不是项目引用只会在项目管理器上产生一次时间成本 - 即在添加新项目时更新每个受影响的解决方案的项目依赖项或新的依赖项必须介绍.这些项目依赖项保存在.sln文件中,在新项目到达或创建新依赖项之前不需要任何维护,这种情况不常发生.
我们使用msbuild在CI服务器上构建项目,CI服务器使用与VS相同的.sln文件.有一个主要的.sln文件,其中包含所有子项目.
我想强调一个更尖锐的问题 - 无法浏览另一个项目中的定义,尽管两个项目都在同一个解决方案中,因为引用是dll引用.这很烦人,这是一个麻烦,没有理由为什么VS坚持项目参考启用该功能.其他工具,如Resharper或Visual Assist没有此限制.唉,我们没有这些工具,也不太可能在可观察的未来.
当您添加特定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)
<ItemGroup>
<Reference Include="ClassLibrary1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<Private>False</Private>
</Reference>
...
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
<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属性的句柄)? …
建立:
使用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)
是什么赋予了?
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) 作为包含许多项目的解决方案的一部分,我有一个引用的项目(通过<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从从头开始 - 这是在相对复杂的整体构建的背景下)
我们有一个使用项目引用的大型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
假设我有两个项目A和B. A取决于B.我可以用两种方式指定:
我的问题是,一旦我为A构建程序集,这两种方法之间的最终输出是否存在差异.
我尝试创建几个简单的项目来模拟这种关系并尝试比较 - 但不同的比较工具告诉我不同的东西.在写一些逐字节比较这些文件的东西时,我想知道你们是否对此有所了解.具体来说,如果我使用dll引用而不是项目引用,构建的程序集的行为是否会有任何差异.
我们最近已升级到VS2010(10.0.40219.1 SP1Rel)和ILOG规则.net 7.1.1.4(x64).现在可以发生以下情况:
这种情况发生在大型解决方案中(大约60个csproj,约15个规则).这种情况发生在较小的解决方案中(6个csproj,1个规则).
我们已经开始采取极端开发措施来避免引用丢失(在调试时卸载所有规则,并在调试后关闭/重新打开VS2010).
我们的项目或软件设置中有什么东西可以改变以阻止项目引用下降吗?
更新:虽然使用调试器是一种可靠的方法来解决"重构规则/引用丢弃"问题,但偶尔也只是通过关闭文件而不使用调试器.
我已经获得了第一笔赏金,如果有人想出一个可以接受的答案,我愿意设立第二笔赏金.
解决方法:我们有三个解决方案文件
开发人员可以安全地调试第三个解决方案,该解决方案没有用于VS的规则文件.
我在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?
我正在为项目添加一个项目引用,它已经添加了一些项目引用.如果我检查现有的属性,它们都有到项目bin目录的路径,例如:
C:\MyProject2\bin\Debug\MyProject2.dll
但是,在添加另一个项目引用时,它最终会有一个指向其obj目录的路径:
C:\MyProject3\obj\Debug\MyProject3.dll
那dll似乎甚至不存在!(虽然这可能是因为我无法将整个解决方案编译好.)
为什么一个项目引用指向bin,另一个指向obj?以及如何纠正它?