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

pup*_*eno 219 .net visual-studio code-sharing

我有两个解决方案,它们有一些共同的代码,所以我想把它解压出来并在它们之间分享.此外,我希望能够独立发布该库,因为它可能对其他人有用.

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

And*_*mar 242

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

Screengrab

根据我的经验,链接比创建库更简单.链接代码导致单个可执行文件具有单个版本.

  • 你为什么这样做?这就是为什么我们有库,封装.我认为你没有做任何商业意识或逻辑意义. (58认同)
  • 此外,您的链接可能不在同一源代码管理下.这是非常危险的建议. (15认同)
  • 在某些情况下,此解决方案很有用.作为一个例子,我在InfoPath 2007中进行开发,将单独的DLL部署到SharePoint中并不简单.为了在InfoPath表单之间共享通用功能,链接类文件方法非常有用.它位于单个表单项目之上一级,所有内容都在源级别进行源控制. (9认同)
  • 甜蜜 - 这就是我一直在寻找的答案.我不想要一个DLL的集合.干杯 (8认同)
  • 另一个有用的例子是说你正在开发两个需要相互通信的应用程序.一个是64位,另一个是32,所以你不一定要从相同的代码构建单独的dll来引用每个项目.这样您就可以模仿使用.h文件的c功能. (5认同)
  • @nav:当你在两个不同的解决方案中重用一个DLL时也是如此,如果你在一个解决方案中重构,另一个解决方案将不会被重构. (4认同)
  • 另一种有用的情况:INTERFACE定义源文件在服务器进程中定义,并由客户端进程使用.不希望该接口源文件的两个副本. (2认同)

ili*_*ian 69

多个解决方案可以引用项目.

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

  • 好的但是怎么样?一些说明? (136认同)
  • 由于产生了多个程序集,这个(旧的)答案本身是不完整的:但是,当与ILMerge*耦合*时 - 尤其是内部化选项 - 它将成为一个非常强大的解决方案. (2认同)
  • @ user2246674:为什么它因多个程序集而不完整?OP对单个组件没有任何说明. (2认同)

Ase*_*ore 32

File > Add > Existing Project...将允许您将项目添加到当前的解决方案.只是添加这个,因为以上帖子都没有指出这一点.这使您可以在多个解决方案中包含相同的项目.


Jon*_*eet 24

可以在多个解决方案中包含项目.我不认为一个项目有一个概念,它是哪个解决方案的一部分.但是,另一种方法是将第一个解决方案构建到一些众所周知的地方,并引用已编译的二进制文件.这样做的缺点是,如果要根据是在构建版本还是在调试配置中引用不同的版本,则需要做一些工作.

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


Rub*_*ink 22

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

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

投入:

    <Visible>false</Visible>
Run Code Online (Sandbox Code Playgroud)

如果要在MySisterProject上面的"虚拟现有项目"文件夹中添加或删除项目,则要隐藏文件和/或防止外卡包含展开.

  • 这是我最新版本的通配符主题...... <Compile Include ="..\_\_Src\**\*.*"Exclude ="..\_\_Src\Properties\AssemblyInfo.cs; ..\_\_Src\bin\**\*.*; ..\_ SRC\OBJ\**\*.*; ..\_ SRC\**\*的csproj; ..\_ SRC\**\*用户; ..\_的Src\**\*.vstemplate"> <Link> Src \%(RecursiveDir)%(文件名)%(扩展名)</ Link> </ Compile> (3认同)
  • @CAD Bloke:是的,那个很有趣.为了清楚起见,我会明确地说明以下内容,以防有人帮助...您可以卸载/重新加载项目以使其获取更改.(Alt-P,L两次).VS2010问题是.targets文件等``导入`.csproj文件得到缓存,直到您重新加载解决方案为止. (2认同)

Joh*_*ers 18

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

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


Meh*_*ras 8

将公共代码提取到类库项目中,并将该类库项目添加到您的解决方案中.然后,您可以通过向该类库添加项目引用来添加对其他项目的公共代码的引用.具有项目引用而不是二进制/程序集引用的优点是,如果将构建配置更改为调试,发布,自定义等,则还将基于该配置构建公共类库项目.


Phi*_*ert 7

您可以在多个解决方案中包含相同的项目,但是您可以保证在未来的某个时间遇到问题(例如,当您移动目录时,相对路径可能会变得无效)

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

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

如果我找到更多时间,我会详细解释.

  • 仅供参考,`svn:externals`硬链接到存储库.移动存储库时,外部链接仍指向旧存储库. (5认同)

Hus*_*lil 7

现在您可以使用共享项目

\n\n
\n

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

\n
\n\n

在此输入图像描述

\n\n

欲了解更多信息,请检查

\n


use*_*637 5

最好创建一个包含所有常用功能的dll类库.无论其他解决方案如何,每个解决方案都可以独立地引用此dll.

事实上,这就是我们工作中的资源组织方式(我相信很多其他地方).

顺便说一句,解决方案不能明确依赖于另一种解决方案.

  • 我相信这是这个问题的最大要点之一,但很多人显然没有明白。 (2认同)

Ste*_*oni 5

如果您尝试在两种不同的项目类型(即:桌面项目和移动项目)之间共享代码,您可以查看共享解决方案文件夹。我必须为我当前的项目这样做,因为移动和桌面项目都需要仅在 1 个文件中的相同类。如果你走这条路,任何链接了该文件的项目都可以对其进行更改,并且所有项目都将根据这些更改进行重建。


小智 5

涉及的两个主要步骤是

1- 创建 C++ dll

在视觉工作室

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.
Run Code Online (Sandbox Code Playgroud)

头文件代码

// 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.
};
}
Run Code Online (Sandbox Code Playgroud)

Cpp文件

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

#include "first_dll.h"

namespace first_dll
{

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

 }
Run Code Online (Sandbox Code Playgroud)

检查这个

**Project-> Properties -> Configuration/General -> Configuration Type** 
Run Code Online (Sandbox Code Playgroud)

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

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

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.
Run Code Online (Sandbox Code Playgroud)

在 C# 项目的顶部添加这一行

Using first_dll; 
Run Code Online (Sandbox Code Playgroud)

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

double var = Class1.sum(4,5);
Run Code Online (Sandbox Code Playgroud)

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


小智 5

您可以托管一个内部NuGet服务器,并共享将在内部和外部在其他项目中共享的公用库。

进一步阅读