您如何在Visual Studio的项目/解决方案之间共享代码?


229

我有两个具有一些通用代码的解决方案,因此我想将其提取出来并在它们之间共享。此外,我希望能够独立发布该库,因为它可能对其他人有用。

  • 使用Visual Studio 2008的最佳方法是什么?
  • 一个项目中是否存在多个解决方案?
  • 对于单独的代码,我是否有单独的解决方案?
  • 解决方案可以依赖另一个吗?

15
2014年。Nuget是答案。
拉维2014年

1
@Ravi我想将我办公室开发的Visual Studio Web应用程序模块化。但是,当我尝试考虑将Visual Studio Web应用程序模块化到不同的Web应用程序时,组件之间出现了循环依赖关系,这是错误的。不能为每个计划的Web应用程序模块化POCO项目,因为存在太多的依赖性。有没有办法我可以使用Nuget来帮助模块化?
CS刘易斯

Answers:


70

一个项目可以被多个解决方案引用。

将您的库或核心代码放入一个项目,然后在两个解决方案中都引用该项目。


150
可以,但是如何?一些指示?
cja

2
这个(旧的)答案由于会导致多个程序集而本身是不完整的:但是,当与ILMerge 结合使用时,尤其是与internalize选项结合使用时,它成为一个非常强大的解决方案。
user2246674 2013年

2
@ user2246674:为什么由于多个程序集而不完整?OP对单个组件一无所知。
约翰·桑德斯

1
@Jfly:重命名不公开可见的内容不会影响外部代码。重命名的东西公开可见的只应使用地方公共代码,以及通用代码本身,所有的项目都在一个单一的解决方案。您可以手动创建包含所有这些项目的“主”解决方案,并且仅用于此目的。
约翰·桑德斯

1
这取决于另一个实例的含义。您可能会做得更好,以一些更多的细节开始一个新的问题。
ilivewithian

248

您可以在两个项目之间“链接”代码文件。右键单击您的项目,选择Add-> Existing item,然后单击Add按钮旁边的向下箭头:

屏幕抓图

以我的经验,链接比创建库更简单。链接的代码将生成具有单个版本的单个可执行文件。


9
甜蜜-这就是我想要的答案。我不想收集DLL。欢呼声
CAD bloke

63
你为什么要这样呢?这就是为什么我们有库,封装的原因。对于您为什么要这样做,我没有任何商业意义或逻辑意义。
Ryan Ternier

16
此外,您的链接可能不受相同的源代码控制。这是非常危险的建议。
库格尔,

11
在某些情况下,此解决方案很有用。作为示例,我正在InfoPath 2007中进行开发,在该环境中很难将单独的DLL部署到SharePoint中。为了在InfoPath表单之间共享通用功能,链接类文件方法非常有用。它被放置在单个表单项目的上一级,并且所有内容都在根级别进行源代码控制。
奥利弗·格雷

6
另一个有用的例子是,您正在开发两个需要相互通信的应用程序。一个是64位,另一个是32位,因此您不必希望从同一代码构建的单独的dll可以引用每个项目。这样,您可以模仿使用.h文件的c功能。
user912447 2013年

33

File > Add > Existing Project...将允许您将项目添加到当前解决方案中。只是添加此内容是因为上述帖子均未指出这一点。这使您可以将同一项目包含在多个解决方案中。


1
这确实有效;不利的一面是,它不会将两个项目都集成到一个程序集中。
伊恩·博伊德

24

可以在多个解决方案中包含一个项目。我认为项目没有概念涉及哪个解决方案。但是,另一种选择是使第一个解决方案构建到某个知名的地方,并引用已编译的二进制文件。这样做的缺点是,如果要基于发布配置还是调试配置来引用不同的版本,则需要做一些工作。

我不相信您可以使一个解决方案实际上依赖于另一个解决方案,但是您可以通过自定义脚本以适当的顺序执行自动构建。基本上将您的公共库当作另一个第三方依赖项(如NUnit等)对待。


该项目确实具有存储nuget包的位置的跟踪,并且可以通过打开解决方案来更改它,这可能会在构建时导致头痛,因此这是一个更好的解决方案。
Shane Courtrille

23

您可以使用以下技术对内联进行通配符内联(这是@Andomar解决方案在.csproj中保存的方式)

<Compile Include="..\MySisterProject\**\*.cs">
  <Link>_Inlined\MySisterProject\%(RecursiveDir)%(Filename)%(Extension)</Link>
</Compile>

投放:

    <Visible>false</Visible>

如果要隐藏文件和/或防止通配符被扩展,则可以在上述“虚拟现有项”文件夹中添加或删除项MySisterProject


好一个。如果您可以避免双关语,这看起来是一个不错的,轻巧的解决方案。
CAD bloke 2012年

@Cad bloke:它确实可以正常工作(就像您的双关语一样:),但是要尽最大努力避免出现链接,还有很多
话要说

2
@CAD Bloke:是的,那很有趣。为了清楚起见,我将明确地说明以下内容,以防它对某人有所帮助...您可以卸载/重新加载项目以使它进行更改。(Alt-P,L两次)。VS2010的问题是,<Import缓存到.csproj文件中的.targets文件等将被缓存,直到您按要求重新加载解决方案为止。
Ruben Bartelink

3
这是我的通配符主题的最新版本... <Compile Include =“ .._ Src * *。 ” Exclude =“ .._ Src \ Properties \ AssemblyInfo.cs; ..__ Src \ bin * *。; ..__ Src \ obj * *。 ;; .._ Src ***。csproj; .._ Src ***。user; .._ Src ***。vstemplate“> <Link> Src \%(RecursiveDir)%(Filename)%(Extension)< / Link> </ Compile>
CAD bloke's

1
@ChrisK这是我对csproj文件... theswamp.org/index.php?topic=41850.msg472902#msg472902的编辑的更多说明。我只是在Notepad ++中编辑它。当我保存它时,VS看到它已更改,并要求重新加载。VS中有一些设置可以控制此行为。
CAD bloke 2013年

18

您只需创建一个单独的类库项目来包含通用代码。它不一定是使用它的任何解决方案的一部分。从任何需要它的项目中引用类库。

唯一的窍门是,您将需要使用文件引用来引用项目,因为它不会成为引用该项目的解决方案的一部分。这意味着实际的输出程序集将必须放置在任何构建引用该程序集的项目的人都可以访问的位置。例如,这可以通过将程序集放在共享上来完成。


我想,如果我创建了一个生成事件并发布该DLL到源控制_lib文件夹中引用的项目,然后检查该DLL中,将工作..似乎有点哈克寿..
hanzolo

1
如果要对每个构建进行源代码控制,则可以使构建目标签出库dll,从构建输出复制到库文件夹,然后签入dll。
约翰·桑德斯

8

您可以在多个解决方案中包含同一个项目,但可以保证一定会遇到问题(例如,在移动目录时,相对路径可能无效)。

经过多年的努力,我终于想出了一个可行的解决方案,但是它要求您使用Subversion进行源代码控制(这不是一件坏事)

在解决方案的目录级别,添加一个svn:externals属性,该属性指向您要包含在解决方案中的项目。Subversion将从存储库中提取项目,并将其存储在解决方案文件的子文件夹中。您的解决方案文件可以仅使用相对路径来引用您的项目。

如果有更多时间,我将详细解释。


在定义项目时,请确保仅使用相对路径...这应该解决一个小问题,尤其是对于可重用的路径。
xtofl

5
仅供参考,svn:externals指向存储库的硬链接。当您移动存储库时,外部链接仍指向旧的存储库。
安多玛

对于git,您可以在GIT中
Michael Freidgeim

8

将通用代码提取到类库项目中,然后将该类库项目添加到您的解决方案中。然后,可以通过将项目引用添加到该类库来添加对其他项目中通用代码的引用。与二进制/程序集引用相比,具有项目引用的优势在于,如果将构建配置更改为调试,发布,自定义等,则通用类库项目也将基于该配置来构建。


5

创建一个包含所有常用功能的dll类库是一个好主意。每个解决方案都可以独立引用此dll,而与其他解决方案无关。

实际上,这就是我们在我的工作中组织的来源的方式(并且我相信在许多其他地方)。

顺便说一句,解决方案不能明确地依赖另一个解决方案。


1
我相信这是很多人显然无法理解的最大问题之一。
Del Lee

5

涉及的两个主要步骤是

1-创建一个C ++ dll

在Visual Studio中

New->Project->Class Library in c++ template. Name of project here is first_dll in 
visual studio 2010. Now declare your function as public in first_dll.h file and 
write the code in first_dll.cpp file as shown below.

头文件代码

// first_dll.h

using namespace System;

namespace first_dll 
{

public ref class Class1
{
public:
    static double sum(int ,int );
    // TODO: Add your methods for this class here.
};
}

Cpp文件

//first_dll.cpp
#include "stdafx.h"

#include "first_dll.h"

namespace first_dll
{

    double Class1:: sum(int x,int y)
    {
        return x+y;
    }

 }

检查这个

**Project-> Properties -> Configuration/General -> Configuration Type** 

此选项应为Dynamic Library(.dll)并立即构建解决方案/项目。

Debug文件夹中创建first_dll.dll文件

2-在C#项目中链接

打开C#项目

Rightclick on project name in solution explorer -> Add -> References -> Browse to path 
where first_dll.dll is created and add the file.

在C#项目的顶部添加此行

Using first_dll; 

现在可以使用某些函数中的以下语句访问dll中的函数

double var = Class1.sum(4,5);

我在VS2010的c ++项目中创建了dll,并在VS2013 C#项目中使用了它。



4

如果您试图在两种不同的项目类型(即,桌面项目和移动项目)之间共享代码,则可以查看shared solutions文件夹。我必须对当前项目执行此操作,因为移动项目和桌面项目都需要只有1个文件的相同类。如果您采用这种方法,则任何链接了文件的项目都可以对其进行更改,并且将根据这些更改来重建所有项目。


Stevoni如何工作?您能否提供更多信息?
史蒂夫·邓恩

@SteveDunn我在很少更新的博客上发布了操作方法(愚蠢的学校和工作阻碍了生活中的乐趣)。可以在这里
Stevoni 2011年

4

在跨项目重用代码时,即当您需要引用和支持不同版本的依赖库时,使用“添加现有文件链接”是一个很好的情况。

否则,如果不复制代码或在源代码控制中使用技巧,就很难通过引用不同的外部程序集来创建多个程序集。

我认为维护一个项目进行开发和单元测试,然后在需要创建引用这些外部程序集的不同版本的程序集时,使用现有文件链接创建“构建”项目是最容易的。


2

在另一个项目中包含一个项目的类文件的一种更简单的方法是,在现有解决方案中添加项目,然后在现有项目中添加新项目的DLL引用。最后,您可以通过在任何类顶部使用using指令对命令进行除法来使用添加的类的方法。


2

从Visual Studio 2015开始,如果将所有代码保留在一个解决方案中,则可以通过添加共享项目来共享代码。然后为您要在其中使用代码的每个项目以及正确的using指令添加对该共享项目的引用。


2

现在您可以使用共享项目

共享项目是在多个应用程序之间共享通用代码的一种好方法。作为Windows 8.1通用应用程序开发的一部分,我们已经在Visual Studio 2013中体验过共享项目类型,但是对于Visual Studio 2015,它是一个独立的新项目模板;并且我们可以将其与其他类型的应用程序(例如控制台,桌面,电话,商店应用程序等)一起使用。当我们希望在单个平台上跨多个应用程序共享通用代码,逻辑以及组件时,这种类型的项目非常有用。 。这也允许访问特定于平台的API,资产等。

在此处输入图片说明

有关更多信息,请检查

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.