在 .NET Core 2.0 DLL 中找不到入口点

Loc*_*cke 11 asp.net .net-core asp.net-core

我找不到任何可以解释这一点的东西——出于某种原因,我的 .NET Core 2.0 ASP.NET 应用程序没有通过以下方式作为 DLL 运行:

dotnet MyProject.Web.dll

相反,我得到了例外:

未处理的异常:System.MissingMethodException:在程序集“MyProject.Web,版本=1.0.0.0,Culture=neutral,PublicKeyToken=null”中找不到入口点。

namespace MyProject.Web
{
public class Program
{
    public static void Main(string[] args)
    {
        LoadDependencies();

        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    } 

    private static void LoadDependencies()
    {
        DependencyLocator.Instance.DefineIfUndefined<IDataProvider, DataProvider>();
    }
}
}
Run Code Online (Sandbox Code Playgroud)

它作为独立的可执行文件运行良好(当在项目配置中定位“控制台应用程序”时),但现在我正在尝试部署到需要它通过 dotnet 命令运行的服务器(作为 DLL,即“dotnet .\MyProject.Web.dll"),它似乎有问题。我在我的服务器和我的本地开发框上都收到了上述异常。

我有点惊讶它找不到 Main 方法——它在 Program.cs 中被声明为静态方法。我错过了什么吗?

(编辑:为了澄清,我试图针对“dotnet”命令运行的 DLL 来自编译为“控制台库”的目标,因为我的服务器明确要求 DLL,因为它们不会运行可执行文件)。

Loc*_*cke 7

好的,所以这很烦人,希望能帮助其他人。

我的主机只想通过 .NET Core 专门运行 DLL。它们不允许运行可执行文件。

因为 DLL 经常被构建为项目中的“类库”输出类型,我认为这是构建它所必需的工作流程。但是,我发现每当您将项目构建为“控制台应用程序”时,它都会构建一个 DLL 和一个 EXE。因此,在上面的示例中,当输出类型为“控制台应用程序”时,MyProject.Web.exe 和 MyProject.Web.dll 都是构建的。

来自“控制台应用程序”的 MyProject.Web.dll 与来自“类库”的 MyProject.Web.Dll 不同。来自“类库”的那个将没有可以在其上发现的入口点,这将导致上述问题。

因此,如果您遇到此错误,请查找与您的 EXE 同名的 DLL——这是您要在 dotnet 控制台中运行的实际 DLL(即 dotnet MyProject.Web.dll)

  • 问题和答案都是模棱两可的。为什么你得到 .exe 而其他人得到 .dll?在目前的状态下,它不会帮助其他人。 (2认同)
  • @LexLi 不知道您是否是投票者,但如果是,则不应该。我遇到了同样的问题。我想我可以在控制台应用程序中删除 exe 文件,并假设 dll 输出是相同的。没想到是这个问题。这个答案肯定对我有帮助。 (2认同)