繁体   English   中英

如何在 Visual Studio 代码中的多个项目之间包含共享的 class

[英]how to include a shared class between several project in visual studio code

我试图在 2 个项目之间包含一个共享的 class,但我似乎不知道如何将它们添加到项目 Visual Studio 代码中,所以我可以使用它们。 我希望这张图片有助于解释我想问的问题

文件夹结构的外观

我不确定出于什么原因您希望在项目之间共享源代码而不是生成的编译程序集,但是鉴于此目录结构...

  • ProjectA\
    • ProjectA.csproj
    • Program.cs
  • ProjectB\
    • ProjectB.csproj
    • Program.cs
  • Shared\
    • Shared.cs

...我能够像这样使用共享代码文件( 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.csProjectB\Program.cs )...

namespace ProjectA // or ProjectB
{
    class Program
    {
        static void Main()
        {
            Shared.Example.SayHello();
        }
    }
}

...通过像这样修改默认控制台应用程序项目文件( ProjectA\ProjectA.csprojProjectB\ProjectB.csproj )以 包含Shared\目录中的所有.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
Hello, World!  This is ProjectA.
PS> dotnet run --project ProjectB
Hello, World!  This is ProjectB.

有趣的是,我像这样运行了dotnet msbuild命令......

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\
    • Shared.cs

...或这个...

  • ProjectA\
    • ProjectA.csproj
    • Program.cs
    • Shared\..\Shared\
      • Shared.cs
  • ProjectB\
    • ProjectB.csproj
    • Program.cs
    • Shared\..\Shared\
      • Shared.cs
  • Shared\
    • Shared.cs

...尽管我可以看到这会导致源代码控制有些头疼。

在上述所有示例中,我使用了方便的基本目录和相对路径,但如果需要,没有理由不能使用绝对路径。

像往常一样创建ProjectAProjectB 然后创建一个共享项目,比如CommonProject 一旦共享项目被引用到 ProjectA 和 ProjectB 中,您应该能够访问所有引用项目中的所有共享类。 您还可以在 class 中包含条件编译符号,以适应每个项目的 class 定义。

我认为首先你应该创建一个 .NET 标准 Class 库项目并像这样引用它:参考图像

对于 .NET Core & SDK 风格项目

将 Directory.Build.props 添加到解决方案文件夹(即两个项目的父文件夹):

<Project>  
    <PropertyGroup>
        <CoreCompileDependsOn>InitGlobal;$(CoreCompileDependsOn)</CoreCompileDependsOn>
    </PropertyGroup>
</Project>

将 Directory.Build.targets 添加到解决方案文件夹(即两个项目的父文件夹):

<Project>  
    <Target Name="InitGlobal" >
        <ItemGroup>
            <Compile Include="$(MSBuildThisFileDirectory)\Global\*.cs" />
        </ItemGroup>
    </Target>
</Project>

最后

将共享/通用 class 文件添加到 \Global 文件夹(相对于上面的 Directory.Build.* 文件)。 小心使用的任何依赖项都包含在每个项目中,或者在 Directory.Build.props 中添加依赖项。

注意 - 全局文件将包含在 Build 和 IntelliSense 中,但在解决方案中不可见。 您可以通过从.targets 中删除元素并将其放入.props 文件中,使它们显示为链接类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM