我不确定出于什么原因您希望在项目之间共享源代码,而不是生成的编译程序集,但鉴于此目录结构。 ..
-
ProjectA\
ProjectA.csproj
Program.cs
-
ProjectB\
ProjectB.csproj
Program.cs
-
Shared\
...我可以像这样使用共享代码文件 (Shared\Shared.cs)...
namespace Shared
{
internal static class Example
{
internal static void SayHello()
{
string assemblyName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
System.Console.WriteLine($"Hello, World! This is {assemblyName}.");
}
}
}
...来自这样的控制台应用程序代码文件(ProjectA\Program.cs 和ProjectB\Program.cs)...
namespace ProjectA // or ProjectB
{
class Program
{
static void Main()
{
Shared.Example.SayHello();
}
}
}
...通过将默认控制台应用程序项目文件(ProjectA\ProjectA.csproj 和ProjectB\ProjectB.csproj)修改为include .cs 目录中的所有.cs 文件...
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<Compile Include="..\Shared\*.cs" />
</ItemGroup>
</Project>
...从基目录运行时会产生这些结果...
PS> dotnet run --project ProjectA
你好世界!这是项目A。
PS> dotnet 运行 --project ProjectB
你好世界!这是项目B。
有趣的是,我这样运行dotnet msbuild command...
dotnet msbuild ProjectA -preprocess:fullproject.xml
...生成一个显示 MSBuild 将使用的幕后定义的文件,它包含一个注释,描述了相同的层次结构,甚至使用了相同的示例名称...
<!-- WARNING: This pattern is there to ignore folders such as .git and .vs, but it will also match items included with a
relative path outside the project folder (for example "..\Shared\Shared.cs"). So be sure only to apply it to items
that are in the project folder. -->
<DefaultExcludesInProjectFolder>$(DefaultItemExcludesInProjectFolder);**/.*/**</DefaultExcludesInProjectFolder>
也许不是一个好的解决方案,但另一个解决方案是使用符号链接/硬链接/连接将共享代码文件/目录直接包含在每个项目中像这样……
-
ProjectA\
ProjectA.csproj
Program.cs
Shared.cs → ..\Shared\Shared.cs
-
ProjectB\
ProjectB.csproj
Program.cs
Shared.cs → ..\Shared\Shared.cs
-
Shared\
...或者这个...
-
ProjectA\
ProjectA.csproj
Program.cs
-
Shared\ → ..\Shared\
-
ProjectB\
ProjectB.csproj
Program.cs
-
Shared\ → ..\Shared\
-
Shared\
...虽然我可以看到这会导致源代码控制方面的一些问题。
在上述所有示例中,我使用了方便的基本目录和相对路径,但如果需要,你没有理由不能使用绝对路径。