如何从解决方案中引用项目?

时间:2014-10-11 11:24:22

标签: c# .net visual-studio msbuild csproj

我有一个Visual Studio C#解决方案,它包含一些项目。其中一个项目需要引用另一个不属于解决方案的项目。

一开始我正在引用dll:

<ItemGroup>
  <Reference Include="ExternalProj1, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
    <SpecificVersion>False</SpecificVersion>
    <HintPath>..\..\Proj1\ExternalProj1.dll</HintPath>
  </Reference>
</ItemGroup>

但是我必须引用项目,以便那些将生成他们的dll。事实上,如果我引用dll并且它们尚未创建,我需要单独构建这些项目。

但是在引用项目时:

<ItemGroup>
  <ProjectReference Include="..\..\Proj1\ExternalProj1">
    <Project>{3341b552-a569-4313-aabc-34452fff60ac}</Project>
    <Name>ExternalProj1</Name>
  </ProjectReference>
</ItemGroup>

但是,构建编译器时无法找到那些程序集。奇怪的是,构建过程报告为已成功完成,但错误窗口报告了一个警告:

  

找不到引用的组件ExternalProj。

那么,我做错了什么?谢谢

1 个答案:

答案 0 :(得分:4)

我看到你正在使用ProjectReference,这是我在普通(非NET)C ++项目中所熟悉的。 Include属性需要命名文件,而不仅仅是基本名称; e.g。

<ProjectReference Include="..\..\Proj1\ExternalProj1.vcxproj">

也就是说,ProjectReference不是Reference。见Common MSBuild Project Items

此外,如果没有为该项目指定,则通过提供的道具文件确定是否自动链接LIB的元数据。管理项目是否甚至产生了LIB?所以这应该(文件名正确)导致指定项目也作为依赖项构建,对其产品做一些事情是另一个问题。

尝试从MSBuild.exe命令行而不是IDE构建,以便在IDE混乱之前查看纯粹的行为,或者添加更多问题。并且,为它提供您想要的特定proj文件,“解决方案”文件。 .sln文件是一个奇怪的野兽,不仅可以让sln中没有项目引用,根本没有sln文件的固有概念。除了要在IDE中显示的项目列表之外,它是一个魔术文件,可以动态转换为主项目,可以让您单独命名各种目标,而无需知道哪个proj文件(或其路径)足够方便,但主要是根据 The Books 与VSBuild兼容。所以要避免它,至少要简化一些事情,以便在探索阶段获得你想要的行为。然后,如果您仍然想要它们,请添加任何并发症:)。