在没有dll的情况下,在两个项目之间共享代码

23

如何在两个项目之间实现代码共享而不生成dll?

问题是:我有一个工具,将用户和组从LDAP同步到数据库。

现在这个工具是一个Windows服务,但是测试起来非常困难和耗时。

因此,我创建了一个控制台应用程序,在那里我可以测试LDAP同步,然后只需将相应的源代码文件复制到服务项目中。

但是...保持公共文件同步有点麻烦。 我不想生成dll,因为这可能会给第三个项目(为服务生成的Windows安装程序)带来问题, 其中我必须使用ExecutingAssembly路径...

有没有一种方法可以在不生成单独的dll的情况下共享代码? 就像自动静态链接一样?


在Vista及更新版本中,符号链接可能会很有用。 - CodesInChaos
@CodeInChaos,在源代码控制/备份中没有简单地存储符号链接的方法,您两者都正在做对吗?=) - Rob
听起来像是 git 把符号链接存储为符号链接。不知道它在 Windows 上是否有效,因为我还没有使用 Vista。根据使用情况,将符号链接添加到 ignore 文件并为每个程序员手动创建它可能已经足够了。有点 hackish,但应该可以工作。 - CodesInChaos
但是对我来说,VS的“作为链接添加”功能看起来更清晰。我不知道那个。 - CodesInChaos
7个回答

38

如何将文件添加为链接?

在Visual Studio中,右键单击您的控制台测试应用程序项目 -> 选择添加现有文件 -> 在文件添加对话框中导航到实际的Windows服务项目中的文件 -> 选择要共享的文件 -> 并在添加按钮上选择添加作为链接选项。


4
添加按钮上那个隐蔽的下拉三角形很难被发现!如果你想要一个共享库,比如在Android和Windows上使用相同的代码但是不同的项目包装器,这就非常有用。 - AndyM
如果我想从目录树中添加一堆文件怎么办?我能递归地添加整个目录吗? - markonius
链接失效 - “糟糕!找不到该页面。” - Pang

15
您可以将文件作为链接添加到项目中。在“添加现有项”对话框中,“添加”按钮右侧有一个下拉菜单,使用它选择“添加为链接”:

alt text

将文件放置在解决方案项目中,并将其作为链接添加到每个项目中。

2
如何手动修改项目文件以指向相同的源文件?
另一种选择是将两个项目放在同一个文件夹中。在其中一个项目中添加一个类,然后在另一个项目中添加现有类并指向刚创建的类。

2
您可以:
  • 将共享代码维护在一个单独的项目中,该项目会生成一个DLL文件,然后使用诸如ILMerge等工具将DLL和EXE合并成一个程序集。
  • 通过调整项目文件或对源代码树布局进行一些花哨的处理,将源文件共享给多个项目。

尽管如此,最好的方法是下定决心将共享代码存储在共享程序集(DLL)中。例如,当您决定通过WCF服务公开此代码时会发生什么?那时情况就变得更加复杂了,因为有3个地方引用了相同的代码文件。不要只考虑现在能让您的生活变得更轻松的事情,还要考虑未来能让您(以及任何其他必须维护代码的人)生活更轻松的事情! =)


ILMerge太不自动化了(除非有一种简单的自动化方法)。我决定选择“有点奇怪”的方式(即将文件作为链接添加)。至于最后一段 - 所有有效和好的论点,但出于上述原因,我不想要一个dll。此外,每次进行更改时,我都必须编译dll项目,而这种方式,我只需按下运行按钮即可。不知道源代码保管库如何,但在最坏的情况下,链接会很快重新添加。 - Stefan Steiger
当然可以在后期构建事件中自动化ILmerge,从命令行执行它。 - Pauli Østerø
@StefanSteiger 你应该意识到按下运行按钮等于构建和运行,对吧?如果有任何未完成的更改,它会在运行之前重新编译项目以及同一解决方案中的所有依赖项目。 - Dan Bechard
@StefanSteiger 你可以使用Costura.Fody作为自动化的替代方案:https://github.com/Fody/Costura - pinki

1

死灵术 - 根据 Visual Studio 2017

您可以创建一个共享项目,然后在另一个项目中引用该共享项目。

它将使用您从共享项目引用的项目中的框架版本和库。只要没有冲突,您还可以在多个项目中使用相同的共享项目。

这基本上是源代码级别的静态链接。
这也适用于HTML&JavaScript文件(具体来说,它适用于发布),但是对于HTML和JS文件,在调试时可能会遇到问题...

它位于“传统Windows桌面”下,但您也可以将其用于.NET Core等。

enter image description here


0

我将描述我们用于管理和测试Windows Service项目的设置。虽然这并没有回答“在没有DLL的情况下共享代码”的问题(Unmesh的答案已经解决了这个问题),但我想OP可能并没有意识到有了DLL后这是多么容易。无论如何,我希望它能帮助某人


创建一个名为LDAPSync的解决方案。在此解决方案中创建三个项目:

  • LDAPSyncLib
  • LDAPSyncSvc
  • LDAPSyncTest

LDAPSyncLib 是一个 DLL 项目,包含所有业务逻辑和主要功能。

LDAPSyncSvc 是一个 Windows 服务项目,包含两个类:一个继承自 ServiceBase 的服务控制器类和一个 Installer 类用于安装你的服务。该项目具有对 LDAPSyncLib 的“项目引用”。

LDAPSyncTest 是一个 GUI 应用程序(WinForms、WCF 等)或控制台应用程序,具体取决于你的需求。该项目还具有对 LDAPSyncLib 的“项目引用”。它的唯一目的是提供一些界面,使你可以轻松地进行所需的调用以进行测试。在 Visual Studio 中,将其设置为“启动项目”。

现在,当您通过Visual Studio进行调试时,您将获得一个漂亮的小GUI或命令窗口,您可以使用它手动进行测试调用。当您将其安装为Windows服务时,LDAPSyncSvc项目的控制器类将接管并处理所有必要的服务请求(启动,停止,暂停等)

我们有大约30个内部Windows服务项目,我们已经持续管理,开发和测试了十多年,这个工作流程已经被证明是非常有价值的,可以快速找到和修复错误。祝您的项目好运,并希望这能帮助一些未来的谷歌用户。


0
如果要共享功能,应该使用 DLL 或类似的方式。
因为你想要分享的是源代码,本质上是文件共享。所以你可以通过让你的项目引用外部资源或让你的源代码控制来做到这一点。
如果你在使用 Visual SourceSafe,则可以在两个文件夹之间建立链接。VSS 将确保它们被视为相同的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接