C#编译错误:无法从* .csproj文件中找到主文件

时间:2019-06-07 14:39:05

标签: c# linux docker .net-core

我从同事那里得到了一个C#/ Docker项目,必须将其与我自己的服务一起使用。这是一个REST API。我的同事为此使用了Visual Studio Community 2019。我现在想在安装了docker的Linux机器上运行它。 有一个docker文件。当我运行docker build时,我收到一条错误消息,指出* .csproj文件中没有指定主要方法。因此,我在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(包含主要方法)

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的使用也很少。我猜/希望用户方面有一个小错误,但是我不知道自己做错了什么。

感谢您的努力。

1 个答案:

答案 0 :(得分:0)

我刚刚解决了这个问题,尽管这让我有些困惑。基本上,我从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)提交这些更改时,我会再次遇到问题。