【问题标题】:C# compile error: Can't find main from *.csproj fileC# 编译错误:无法从 *.csproj 文件中找到 main
【发布时间】:2019-10-23 02:02:40
【问题描述】:

我从同事那里得到了一个 C#/Docker 项目,并且必须将它与我自己的服务一起使用。它是一个 REST API。我的同事为此使用了 Visual Studio Community 2019。我现在想在安装了 docker 的 linux 机器上运行它。 有一个泊坞窗文件。当我运行 docker build 时,我收到一条错误消息,指出 *.csproj 文件中没有指定 main 方法。因此我在 csproj 文件中指定了启动对象。以前没了。

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
    <DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
    <StartupObject>Program</StartupObject> // <-- I added this line nothing else
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.1.2" />
    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.4.10" />
    <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.9" />
  </ItemGroup>

</Project>

但我在运行 docker build 时仍然收到错误消息:

user@notebook:~/Schreibtisch/DeviceApi/DeviceApi$ sudo docker build -t deviceApi .
[...]
CSC : error CS1555: Could not find 'Program' specified for Main method [/src/DeviceApi/DeviceApi.csproj]

项目结构如下。 有一个名为 DeviceApi 的目录。那是我的工作目录(你可以从我的命令行上看到)。 在该目录中,在其他项目文件旁边有这些文件:Dockerfile、DeviceApi.csproj、Program.cs(其中包含 main 方法)

user@notebook:~/Schreibtisch/DeviceApi/DeviceApi$ ls
appsettings.Development.json  DeviceApi.csproj             Program.cs
appsettings.json              DeviceApi.csproj.user        Properties
bin                           Handler                      ResponseFilter
Controllers                   Startup.cs                   DBManager
Models                        Util                         Dockerfile
obj                           wwwroot

这里是 Dockerfile 的内容:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["DeviceApi.csproj", "DeviceApi/"]
RUN dotnet restore "DeviceApi/DeviceApi.csproj"
COPY . .
WORKDIR "/src/DeviceApi"
RUN dotnet build "DeviceApi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "DeviceApi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "DeviceApi.dll"]

这是Program.cs的内容:

namespace DeviceApi
{
    public class Program
    {

        public static ILogger<Program> LOGGER = null;
        public static IConfiguration CONF = null;
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();
            LOGGER = host.Services.GetRequiredService<ILogger<Program>>();
            CONF = Startup.Configuration;
            host.Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) => [...] ;
    }
}

我的同事为此使用了 Visual Studio。 我之前没有使用过 C#,并且对 Visual Studio 的经验很少。我猜/希望我这边有一个小的用户错误,但我不知道我做错了什么。

感谢您的努力。

【问题讨论】:

    标签: c# linux docker .net-core


    【解决方案1】:

    我刚刚解决了这个问题,虽然它让我有点困惑。基本上我从 dockerfile 中删除了子目录。

    我将 dockerfile 编辑如下:

    FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
    WORKDIR /app
    EXPOSE 80
    EXPOSE 443
    
    FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
    WORKDIR /src
    COPY ["DeviceApi.csproj", "./"]
    RUN dotnet restore "DeviceApi.csproj"
    COPY . .
    WORKDIR "/src/"
    RUN dotnet build "DeviceApi.csproj" -c Release -o /app
    
    FROM build AS publish
    RUN dotnet publish "DeviceApi.csproj" -c Release -o /app
    
    FROM base AS final
    WORKDIR /app
    COPY --from=publish /app .
    ENTRYPOINT ["dotnet", "DeviceApi.dll"]
    

    我还是有点困惑,因为 dockerfile 和 csproj 文件是由 Visual Studio 自动生成的。我不知道 Visual Studio 对 Docker 的行为与我在 Linux 机器上的行为有何不同。 它现在可以工作,但我再次预计在为其他人(他们将再次使用 Visual Studio)提交这些更改时会出现问题。

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 2014-12-24
      • 1970-01-01
      • 2023-04-02
      • 2015-07-27
      • 2014-05-23
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多