【发布时间】:2009-12-09 04:28:42
【问题描述】:
我有一个包含大量项目和安装程序项目的解决方案。一个项目使用第三方包。该软件包带有一个本地 DLL 和一个 .net 包装器 DLL。为了使代码工作,.net 包装 DLL 需要在运行时找到本机 DLL。但代码在编译时从不直接引用本机 DLL(代码在编译时与 .net 包装器 DLL 对话)。
现在我必须选择正确的方式来部署本机 DLL,在程序员机器上的编译期间和在用户机器上的安装期间。
基本上我有两个选择,要么将本机 DLL 放入 Windows 系统文件夹,要么将本机 DLL 放入包含 exe 文件的本地文件夹中。
要将本机 DLL 放入系统文件夹,我需要一个构建后脚本在构建解决方案后将文件 xcopy 到目录。我还需要在安装程序项目中创建一个系统文件夹输出,以便安装程序在客户端机器上工作。我不知道将文件复制到系统文件夹是否是个好主意。对于这个解决方案,每次有人(大团队中的其他人)创建一个新的安装程序时,他或她必须记住创建系统文件夹输出并在配置下添加本机 DLL,否则他或她的安装程序将无法安装一个可用的用户计算机上的软件。
要将本机DLL放到本地文件夹中,我有以下两种方法: 1. 使用构建后脚本。这个解决方案,我必须在我的大解决方案中找出每个使用本机 DLL 引用该项目的可执行项目,并将构建后脚本链接到每个这样的可执行项目。将来,当某人(大团队中的其他人)创建具有相同类型的新可执行项目时,他或她必须记住链接相同的构建后脚本,否则可执行文件将无法找到本机 DLL .这是我真正不喜欢的,人们往往会忘记。
- 我可以将本机 DLL 添加到使用它的项目中,并在 DLL 的属性配置中,将其设置为“如果较新则复制”。这样,本机 DLL 将被复制到项目的输出文件夹以及引用该项目的每个项目。这样,我就不用记住任何东西了。本机 DLL 将被复制到每个依赖项目的本地文件夹中。
这似乎是一个很好的解决方案。但是 msbuild 命令似乎无法巧妙地处理这种情况。例如,假设A项目直接使用native DLL,我将native DLL添加到项目A。项目B指项目A,项目C指项目B和项目A。如果使用msbuild构建解决方案,则native DLL将是重复复制到项目C的输出文件夹3次,一份参考项目A,一份参考项目B,一份参考项目B到项目A。在我的大解决方案中,在依赖链接的末尾,本机 DLL 将以指数方式多次复制到同一输出文件夹,而不管“如果较新则复制”设置。这需要花费大量时间来构建整个解决方案。
现在我完全不知道什么是适合我的情况的最佳解决方案。对于使用本机 DLL 的任何人,您如何部署 DLL 1. 既方便在开发人员机器上(编译和运行)部署,又在用户机器上(安装和运行)部署,2. 大团队的开发人员没有当他或她向解决方案添加新项目/安装程序时要记住任何事情, 3. 足够聪明的构建方式,避免不必要的冗余操作。感谢您提前提供任何提示、网络教程、建议或聪明的教导。
【问题讨论】:
标签: c# visual-studio-2008 msbuild