【问题标题】:how to include a shared class between several project in visual studio code如何在 Visual Studio 代码中的多个项目之间包含共享类
【发布时间】:2021-03-30 15:49:38
【问题描述】:

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

【问题讨论】:

  • 创建项目C,放类,添加项目A和项目B对项目C的依赖
  • 当 Visual Studio 是社区版的 Visual Studio 时,你为什么要使用 Visual Studio Code,它为你提供标准的 IDE 体验
  • @TheGeneral 我在 Visual Studio 代码中启动了这个项目,我喜欢“dotnet watch”控制台,因为它会在我保存时为我编译。
  • OP,你说的是共享源代码吗?或者您只是想共享一个程序集并设置一个参考? (在大多数情况下,c# 开发人员不会像 c++ 开发人员那样在项目之间共享源代码)
  • @JohnWu 共享源代码。

标签: c# .net-core visual-studio-code


【解决方案1】:

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

  • 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)修改为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\
    • Shared.cs

...或者这个...

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

...虽然我可以看到这会导致源代码控制方面的一些问题。

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

【讨论】:

  • 我昨晚搞定了,我意识到您需要创建另一个项目并将 csproj 包含到您希望与之共享的项目 csproj 文件中。
  • 在我上面演示的Shared代码目录中,我不必创建项目文件。我不确定您的意思是什么,或者您将如何将一个项目包含在另一个项目中,而不是通常将其添加为参考的方式,它将构建输出从一个复制到另一个。
  • 我已经测试了您的演示,它运行良好,但我决定包含 csproj,因为我可以将 nuget 包集中在该文件夹中。感谢您的回复。
  • OP 可能不想使用 DLL 的原因可能是因为它会导致更多的部署复杂性,并且混淆是一个问题,因为所有方法都需要公开。假设涉及超过 1 个源文件,我发现创建 DLL 是最好的解决方案,而不是使用共享项目(设计起来很麻烦)。拥有 DLL 后,您可以使用混淆工具来合并程序集并内部化方法。现在您拥有两全其美的优势 - 您的代码可以被混淆并嵌入到 1 个应用程序中。
【解决方案2】:

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

【讨论】:

  • 没关系我没有注意到visual-studio-code标签
【解决方案3】:

我认为首先你应该创建一个 .NET 标准类库项目并像这样引用它: Reference image

【讨论】:

【解决方案4】:

适用于 .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>

终于

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

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

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2011-04-08
    • 2012-11-11
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多