【发布时间】:2009-05-01 14:46:49
【问题描述】:
出于某种原因,我们有一个脚本可以创建批处理文件,以将我们编译的程序集、配置文件和各种其他文件 XCOPY 到网络共享中,供我们的 beta 测试人员使用。我们确实有安装程序,但有些没有运行安装程序所需的权限,或者它们在 Citrix 上运行。
如果您一提到 XCOPY 和 Citrix,就吐得满桌都是,那就以此为借口早点回家吧。不客气。
代码目前有数百行,如:
CreateScripts(basePath, "Client", outputDir, FileType.EXE | FileType.DLL | FileType.XML | FileType.CONFIG);
过去更糟糕,有 20 个 int 参数(每种文件类型一个)表示是否将该文件类型复制到输出目录。
这数百行创建了具有数千行 XCOPY 行的上传/下载批处理文件。在我们的设置项目中,我们可以引用诸如“来自客户端的主要输出”和“来自客户端的内容文件”之类的内容。我希望能够通过非设置项目以编程方式执行此操作,但我不知所措。
显然,MS 使用 API 或通过解析 .csproj 文件来做到这一点。我该怎么做呢?我只是在寻找一种方法来获取任何设置类别的文件列表,即:
- 主要输出
- 本地化资源
- 内容文件
- 文档文件
编辑: 我有一个像哈斯建议的设置项目,它是我正在寻找的一半。唯一无法成为完美解决方案的问题是多个项目依赖于位于各自文件夹中的相同程序集,并且设置只会复制文件一次。
例子:
项目 Admin、Client 和 Server 都依赖 ExceptionHandler.dll,Admin 和 Client 都依赖 Util.dll,而 Server 不依赖。这就是我要找的:
- 管理员
- Admin.exe
- Admin.exe.config
- ExceptionHandler.dll
- Util.dll
- 客户端
- Client.exe
- Client.exe.config
- ExceptionHandler.dll
- Util.dll
- 服务器
- Server.exe
- Server.exe.config
- ExceptionHandler.dll
由于引用的程序集都是一样的,我得到的是这样的:
- 管理员
- Admin.exe
- Admin.exe.config
- ExceptionHandler.dll
- Util.dll
- 客户端
- Client.exe
- Client.exe.config
- 服务器
- Server.exe
- Server.exe.config
当客户端或服务器找不到它所期望的两个 DLL 之一时,这会导致 FileNotFoundException。
我是否缺少一个设置属性以使其始终复制输出,即使它在另一个项目的输出中的其他地方重复?
再次编辑:所有引用的 DLL 都设置为“复制本地”,并且一直如此。我在using NAnt and XSLT to grab the list of files 上找到了一篇不错的文章,因此这可能也是一个可能的解决方案,正如 neouser99 所建议的那样。
接受的解决方案:我几乎回到了我开始的地方。所有 .exe 和 .dll 输出都放在安装项目中的“bin”目录中,松散地打包。其他每个应用程序文件夹包含该目录中可执行文件的快捷方式。
现在不同的是,我将向安装程序添加一个自定义操作以使用反射,枚举每个可执行输出的依赖项,并将 .exe 和 .dll 文件复制到单独的目录中。有点痛苦,因为我只是假设有一种方法可以通过一些设置库以编程方式检测将包含哪些文件。
【问题讨论】:
标签: c# installation setup-project