我有一个VS2017解决方案,包含多个项目,全部位于.NET中。有一个C#项目 A ,一个.NET应用程序,具有依赖项 B ,这是另一个Visual C ++项目,只是本机库的包装。它们存储在NuGet程序包中,该程序包 B 被引用为依赖项 C 。
说明性地: A → B → C
C 包含2个DLL(以及其他一些不相关的内容)。它们几乎是相同的,只有一种功能的实现方式不同(有理由将其分开)。在某些情况下,需要一个DLL,在某些情况下,则需要另一个。它们具有相同的名称(不可更改),因此不能将它们都复制到输出目录中。
要控制选择哪个DLL, C 的NuGet软件包在其.targets
文件中包含一些逻辑。它基本上是基于属性(例如,具有有效值NativeDllType
和TypeOne
的属性TypeTwo
选择合适的DLL)。此属性必须在引用项目中定义,因此在.targets
文件中可见。
我发现只有 B (作为直接引用 C 的项目)可以将此属性设置为实际控制选择。如果我将该属性设置为 A ,那么它的范围似乎并没有达到 C ,它根本没有任何作用。 (我首先从 B 中删除了该属性,以防止覆盖)
问题
部分解决方案(绕过此问题)
B 不需要 C 即可构建,只需要运行时即可。由于 B 只是包装程序,因此该项目不可执行,因此始终会在其他要使用的地方引用它,例如 A (要运行的实际应用程序)。这意味着 C 可能不需要在 B 中引用,而是在 A 中引用,从而使其成为 A ”的直接依赖关系。然后, A 可以将项目属性设置为传播到 C ,这样就可以正常工作。但是,如果可能的话,我希望在包装器上引用这些库。