【发布时间】:2012-09-05 09:01:15
【问题描述】:
我的项目结构如下:
Library1 <--[project reference]-- Library2 <--[ref]-- Executable
-------- -------- ----------
ContentFile .cs files .cs files
.cs files
所有项目引用的 CopyLocal = true。
当我构建项目时,ContentFile 被复制到Library2 的输出目录,但没有复制到Executable 的输出目录,这意味着应用程序运行时缺少ContentFile 的可执行文件。
为什么内容文件被复制到Library2 的输出目录,而不是Executable 的输出目录?有没有办法将它也复制到后者(我想在没有构建事件的情况下这样做,因为我相信人们会忘记这一点)?
我正在寻找一个合理且可维护的解决方案;在添加新项目或新的间接引用的内容文件时需要最少的努力,因此不太可能简单地忘记这样做。
使用构建后事件(如xcopy ../Library/bin/Debug/SomeDll.dll bin/Debug);并手动将项目的输出目录设置为$(SolutionDir)/bin/... 而不是默认值(基于每个项目),很快就变得一团糟。在“主项目”中添加内容文件作为链接也太乏味了。如果 C# 的输出文件具有与 Visual C++ 相同的默认设置(即$SolutionDir/$Platform/$Configuration),那会很好,但它没有。
我也考虑过根本不使用标准的 MSBuild 过程并编写自定义构建目标(例如在 Atmel Studio 中使用 gcc),但我并没有走多远。此外,我希望 Visual Studio 的标准“构建”和“调试”命令能够像往常一样工作。
更新:
这里有更多关于我在做什么的细节。
我有一个Executable 项目的解决方案。此外,还有很多项目可以调用Plugins。 Executable 通过托管项目引用引用所有这些 Plugins。
由于插件项目是为可执行文件量身定制的,但可能具有可重用的组件,因此主要功能通常在 External 项目中实现,而 Plugin 项目只是一个包装器(尽管并非总是如此)。
说External 项目有时会使用第三方提供的本地DLL。然后将这些 DLL 作为内容文件添加到 External 项目中,并将 Copy to output dir 设置为 Copy always。所以结构看起来像上图:
External <---------------[is not aware of]--------------------+
-------- |
.cs files <--[reference]-- PluginWrapper <--[reference]-- Executable
"Native DLL" ------------- ----------
.cs files .cs files
奇怪的是,“本机 DLL”被复制到 External 的输出目录(显然),以及 PluginWrapper 的,但不是 Executable's.
然后,开发人员的工作流程是编写一个 External 作为一个完全隔离的实体(它们经常被重用),用 PluginWrapper 包装它,然后只添加对PluginWrapper 到Executable 的项目引用。我觉得很奇怪,这显然是一件不常见的事情。
我认为也许编辑 Executable 的 MSBuild 目标 XML(也包括间接引用的内容文件)可以解决问题。
我可能希望按照建议将 DLL 作为嵌入式资源添加到项目中,但是像这样嵌入本机 DLL 对我来说似乎很奇怪。最后,正如 Brenda Bell 所建议的那样,通过从上图中删除“[不知道]”并添加对 External 的项目引用来更改开发人员的工作流程可能是最明智的解决方案,即使并不理想。
更新 2
请注意,嵌入式资源的想法可能并不适用于所有情况。如果需要在可执行文件的目录中放置依赖项(不是 cwd 或任何东西),那么这可能无法正常工作,因为安装文件夹中缺少管理员权限(从嵌入式资源中解压缩文件)。听起来很奇怪,但这是我们使用的第 3 方库之一的严重问题。
【问题讨论】:
-
您能否更具体地说明您已经考虑/放弃了哪些解决方案?如果有人向您建议您出于某种原因已经拒绝自己的事情,那将是浪费时间。
-
@JensH 对不起,我忘了补充。使用构建后事件;并手动将项目的输出目录设置为
$(SolutionDir)/bin/...而不是默认的(基于每个项目),很快就变得一团糟。在“主项目”中添加内容文件作为链接也太乏味了。 -
您是否尝试过将所有三个项目放在同一个解决方案中,并根据需要设置它们的项目依赖关系?
-
@StarPilot 是的,这正是我在问题中描述的情况。由于某种我不知道的原因,它不起作用。
-
您也可以将所有内容放在一个单独的项目中,并在需要的地方引用它。不过,我仍然会使用嵌入式资源。
标签: c# .net visual-studio projects-and-solutions