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

13

我找不到任何解释--由于某种原因,我的.NET Core 2.0 ASP.NET应用程序无法通过以下方式作为DLL运行:

dotnet MyProject.Web.dll

相反,我会收到异常:

Unhandled Exception: System.MissingMethodException:程序集'MyProject.Web,Version = 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>();
    }
}
}

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

我很震惊它找不到Main方法——它声明为静态,在Program.cs中。我有什么遗漏吗?

(编辑:为了澄清,我尝试针对“控制台库”编译的目标运行DLL,因为我的服务器明确要求使用DLL,而不是可执行文件)。


我对你的问题感到非常困惑。控制台应用程序需要主函数,根据你的代码,当你在独立模式下运行时,你正在运行控制台。请分享在服务器上部署的原因。 - Sachin Choube
当我尝试通过dotnet MyProject.Web.dll运行应用程序时,我会得到上面指定的异常。如果我在本地编译并将其作为应用程序运行,则可以正常运行/工作。但是,我们的服务器环境要求我们的Web内容通过dotnet命令部署/运行为DLL。当我通过dotnet运行DLL时,它不起作用,这就是我正在努力解决的问题。 - Locke
2个回答

8

好的,这是一个很烦人的问题,希望能对其他人有所帮助。

我的主机要求仅通过.NET Core运行DLL文件。他们不允许运行可执行文件。

因为DLL通常作为“类库”输出类型在项目中构建,我认为这是构建它所必需的工作流程。然而,我发现每当你将项目构建为“控制台应用程序”时,除了EXE之外,还会构建一个DLL。因此,在上面的示例中,“Console Application”输出类型会同时构建MyProject.Web.exe和MyProject.Web.dll。

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

因此,如果您遇到此错误,请查找与相同名称的EXE一起发送的DLL - 这是您想要在dotnet控制台中运行的实际DLL(即dotnet MyProject.Web.dll)。


2
问题和答案都含糊不清。为什么有些人得到的是.exe文件,而另一些人得到的是.dll文件?在当前状态下,它对其他人没有帮助。 - Lex Li
2
@LexLi 不知道你是否是那个点踩的人,但如果是的话,你不应该这样做。我遇到了完全相同的问题。我以为我可以在控制台应用程序中解决exe文件的问题,并且认为dll输出将是相同的。我不知道这是问题所在。这个答案绝对帮助了我。 - BVernon
1
一样,答案为我节省了可能数小时的挫败感。 - BlackSpy
@Locke,你解决了这个问题吗?我在AWS Elastic Beanstalk上遇到了同样的问题。当我们只想要类库时,使用控制台应用程序并不是一个干净的解决方案。 - user2650277
@user2650277 - 你看到解决方案了吗?基本上,你需要将它构建为一个控制台应用程序,然后使用同名的“DLL”文件 -- 所以如果你的项目是一个控制台应用程序,名字叫做“MyProject.exe”,那就找“MyProject.dll” -- “MyProject.dll” 就是你要找的东西。 - Locke
显示剩余6条评论

0
我根据@Locke的回答进行了一些额外的调查,并找到了一个解决方案,适用于类库。您需要在上传到ElasticBeanstalk的zip文件中添加一个Procfile,这样EB就知道哪个DLL包含入口点。该DLL通常是控制台应用程序,而解决方案中的其他项目将是类库。
假设MyProject.Web.dll是控制台应用程序,Procfile应具有以下内容。 web: dotnet MyProject.Web.dll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接