3

我在这里构建了大量的控制台应用程序来运行业务流程。大多数都具有相同的性质,它们被部署到应用程序服务器,访问源数据库并将暂存的数据放入目标数据库。一些访问文件共享等。

鉴于这种设置,我喜欢一遍又一遍地使用相同的日志记录包 (log4net)。我将配置保存在每个 app.config 中。但是,我一直发现我随身携带了 log4net 的 DLL。

我的意思是当我开始一个新项目时,我必须参考 log4net。我选择不将 log4net 放入 GAC 或将其完全安装到我的开发机器上。相反,我将整个下载包放在一个目录中,通常这样做:

我获取 DLL 并在我的控制台应用程序项目中创建一个 /lib 目录并引用它。

这个接缝的好处是我总是知道我有正确的版本,因为我将 DLL 复制到本地。我也在项目中检查它。

但是,缺点是我最终会得到大量项目,每个项目都有一个 /lib 目录,通常存在相同的 DLL。

我究竟做错了什么?我只是错过了解决方案/项目开发背后的整个想法吗?我觉得我的项目是如此不同,以至于我不希望它们都加载到一个解决方案中。

我很想知道其他人如何解决这个问题。

4

2 回答 2

1

为每个单独的控制台项目创建一个 lib 文件夹只是为了容纳 DLL,除了确保它存在于您的机器上本地之外,没有任何实际用途。如果您担心组织,那可能会让事情变得更糟,因为现在您的开发机器和应用服务器上有多个 DLL 副本,所有这些副本都是相同的。

当 log4net 发布更新时会发生什么?然后,您必须为 log4net、重建和重新部署更新每个独立/物理副本和参考。如果您使用除 log4net 之外的多个 3rd 方 DLL,问题只会变得更糟。

话虽如此,当您添加第三方引用时,默认情况是每次编译时它都会将 DLL 复制到本地的 build 文件夹,并且您的控制台程序将使用该本地副本。您可以通过自己添加一个来验证这一点,并查看Copy Local引用的属性(应设置为 true)。所以基本上,你一直在做 VS 已经为你做的额外工作。

我要做的是将所有 3rd 方 DLL 存放在您的开发机器上的中央目录中,并且每次制作控制台应用程序时只需简单地添加对这些 DLL 的引用。每次部署时,它都会携带 DLL 的本地副本。如果有新的第 3 方 dll 版本,您仍然需要更新每个解决方案中的每个引用,重新构建并将您的应用程序重新部署到应用程序服务器......但是,不同之处在于您只更新一个实体副本!

于 2013-08-16T14:19:34.693 回答
1

你看过ilmerge吗?您应该能够将您的 log4net.dll 合并到您的可执行文件中以使其独立。

示例用法(作为构建后步骤):

"$(SolutionDir)Lib\ilmerge" /targetplatform:v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319 /out:$(ProjectDir)bin\Merged\MyExe.exe MyExe.exe log4net.net40.dll
于 2013-08-16T14:26:37.183 回答