来自引用的 .NET Standard 项目的多个 DLL
Multiple DLLs from referenced .NET Standard projects
我已经使用 Visual Studio 2017 和默认设置创建了三个 .NET Standard class 库 C# 项目。
项目:
- 主项目
- 时间计划
- 依赖项 -> MainProject
- 时钟项目
- 依赖项 -> TimeProject
他们每个人都必须有自己的输出目录,如:
<OutputPath>C:\Projects\DataControl\Build\MainProject</OutputPath>
<OutputPath>C:\Projects\DataControl\Build\TimeProject</OutputPath>
<OutputPath>C:\Projects\DataControl\Build\ClockProject</OutputPath>
项目 DLL 文件放置在输出目录中,但问题是引用的项目 DLL 也放置在输出目录中(TimeProject.dll 和 MainProject.dll)
输出目录(复制本地 = 真):
- \Build\MainProject:
- MainProject.dll
- \Build\TimeProject
- MainProject.dll
- TimeProject.dll
- \Build\ClockProject
- MainProject.dll
- TimeProject.dll
- ClockProject.dll
如果我将 属性 Copy Local
更改为 false,直接引用的项目中的 DLL 将消失。那更好,但是嵌套引用的 DLL 仍然存在 -> MainProject.dll in ClockProject.
输出目录(复制本地 = false):
- \Build\MainProject:
- MainProject.dll
- \Build\TimeProject
- TimeProject.dll
- \Build\ClockProject
- MainProject.dll
- ClockProject.dll
我想防止 ClockProject 在其输出目录中创建 MainProject.dll,因为 MainProject.dll 已经存在于 MainProject 的输出目录中。
我的项目很大,在这种情况下,我的项目文件夹中有很多相同的 DLL。但是,在我的程序启动期间,逻辑还会在子文件夹中搜索 DLL,然后找到同一项目的多个 DLL,这会导致版本冲突。总的来说,我想保留这个逻辑,所以我正在寻找一个只生成项目 DLL 的解决方案,而不是引用的。
最后,我的 csproj 文件。其他两个项目文件看起来相似。
ClockProject.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>C:\Projects\DataControl\Build\ClockProject</OutputPath>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TimeProject\TimeProject.csproj">
<Private>false</Private>
</ProjectReference>
</ItemGroup>
</Project>
对于这样的项目,我转到每个项目属性并设置一个通用输出目录。这样所有的项目都将它们的构建转储到一个目录中。
因为那是不可能的,在你的参考 select MainProject.dll 参考中,查看属性并将复制本地设置为 False。
您的设计方式有误,这就是版本冲突的原因。
您需要重新设计解决方案,以便项目的依赖关系树具有正确的层次结构:
主项目<-时间项目<-时钟项目
修复您的解决方案:
- 删除所有项目中的所有引用。
- 自己构建 ClockProject(或者 MainProject,如果这是你想要走的令人困惑的方式)。
- 打开 TimeProject,引用 Clock Project 并构建 TimeProject(或从 TimeProject 引用 Main 并构建)。
- 打开 MainProject 并引用 TimeProject(或从 ClockProject 引用 TimeProject)。
在每一步中,您可能都需要重构周围的事物。从每个项目引用 Main 是一个 大 no-no。您引用小型、模块化、封装的库,并在解决方案中为 MainProject 构建依赖关系树。
我找到了以下解决方案:
ClockProject 需要 MainProject 和 TimeProject。
如果我只引用 ClockProject 中的 TimeProject 那么它可以工作(因为 TimeProject 引用 MainProject),但是 MainProject.dll 被复制到我不想要的 ClockProject Output 文件夹。
但是,如果我在 ClockProject 中引用两个项目,即 Main- 和 TimeProject 并将两者都设置为 CopyLocal = false,则只有 ClockProject.dll 将被复制到 ClockProject 的输出文件夹中。
我已经使用 Visual Studio 2017 和默认设置创建了三个 .NET Standard class 库 C# 项目。
项目:
- 主项目
- 时间计划
- 依赖项 -> MainProject
- 时钟项目
- 依赖项 -> TimeProject
他们每个人都必须有自己的输出目录,如:
<OutputPath>C:\Projects\DataControl\Build\MainProject</OutputPath>
<OutputPath>C:\Projects\DataControl\Build\TimeProject</OutputPath>
<OutputPath>C:\Projects\DataControl\Build\ClockProject</OutputPath>
项目 DLL 文件放置在输出目录中,但问题是引用的项目 DLL 也放置在输出目录中(TimeProject.dll 和 MainProject.dll)
输出目录(复制本地 = 真):
- \Build\MainProject:
- MainProject.dll
- \Build\TimeProject
- MainProject.dll
- TimeProject.dll
- \Build\ClockProject
- MainProject.dll
- TimeProject.dll
- ClockProject.dll
如果我将 属性 Copy Local
更改为 false,直接引用的项目中的 DLL 将消失。那更好,但是嵌套引用的 DLL 仍然存在 -> MainProject.dll in ClockProject.
输出目录(复制本地 = false):
- \Build\MainProject:
- MainProject.dll
- \Build\TimeProject
- TimeProject.dll
- \Build\ClockProject
- MainProject.dll
- ClockProject.dll
我想防止 ClockProject 在其输出目录中创建 MainProject.dll,因为 MainProject.dll 已经存在于 MainProject 的输出目录中。
我的项目很大,在这种情况下,我的项目文件夹中有很多相同的 DLL。但是,在我的程序启动期间,逻辑还会在子文件夹中搜索 DLL,然后找到同一项目的多个 DLL,这会导致版本冲突。总的来说,我想保留这个逻辑,所以我正在寻找一个只生成项目 DLL 的解决方案,而不是引用的。
最后,我的 csproj 文件。其他两个项目文件看起来相似。
ClockProject.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<OutputPath>C:\Projects\DataControl\Build\ClockProject</OutputPath>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TimeProject\TimeProject.csproj">
<Private>false</Private>
</ProjectReference>
</ItemGroup>
</Project>
对于这样的项目,我转到每个项目属性并设置一个通用输出目录。这样所有的项目都将它们的构建转储到一个目录中。
因为那是不可能的,在你的参考 select MainProject.dll 参考中,查看属性并将复制本地设置为 False。
您的设计方式有误,这就是版本冲突的原因。
您需要重新设计解决方案,以便项目的依赖关系树具有正确的层次结构:
主项目<-时间项目<-时钟项目
修复您的解决方案:
- 删除所有项目中的所有引用。
- 自己构建 ClockProject(或者 MainProject,如果这是你想要走的令人困惑的方式)。
- 打开 TimeProject,引用 Clock Project 并构建 TimeProject(或从 TimeProject 引用 Main 并构建)。
- 打开 MainProject 并引用 TimeProject(或从 ClockProject 引用 TimeProject)。
在每一步中,您可能都需要重构周围的事物。从每个项目引用 Main 是一个 大 no-no。您引用小型、模块化、封装的库,并在解决方案中为 MainProject 构建依赖关系树。
我找到了以下解决方案:
ClockProject 需要 MainProject 和 TimeProject。
如果我只引用 ClockProject 中的 TimeProject 那么它可以工作(因为 TimeProject 引用 MainProject),但是 MainProject.dll 被复制到我不想要的 ClockProject Output 文件夹。
但是,如果我在 ClockProject 中引用两个项目,即 Main- 和 TimeProject 并将两者都设置为 CopyLocal = false,则只有 ClockProject.dll 将被复制到 ClockProject 的输出文件夹中。