Ubuntu下msbuild构建.NET4.8 Web项目后mono运行无入口点问题
核心报错原因
你碰到的<dll_name.dll> doesn't have an entry point报错和运行方式错误直接相关:基于.NET Framework 4.8的ASP.NET Web应用(MVC/Web Forms/传统Web API)编译后生成的是类库文件,不是带Main()入口方法的可执行程序集,不管是bin目录下的正式编译dll,还是obj/Debug下的编译中间产物,都不能直接用mono xxx.dll命令启动。
正确运行方案
1. 用ASP.NET宿主启动站点,不要直接运行项目dll
Linux环境下Mono生态提供了对应.NET 4.x的ASP.NET专用宿主xsp4,操作步骤如下:
- 先确认环境安装了
mono-xsp4组件,Ubuntu源内的完整mono环境一般自带该组件,缺失的话直接通过apt安装即可 - 终端切换到项目根目录(即存放Web.config、Global.asax、Views文件夹、Content静态资源文件夹的目录,不要切到bin目录)
- 执行命令
xsp4 --port 自定义端口号,比如用8080端口就跑xsp4 --port 8080 - 启动完成后直接访问
http://localhost:端口号即可正常访问站点,宿主会自动加载bin目录下的程序集、读取配置、定位视图文件
2. 跳过手动csc编译的无效操作
你直接执行csc StartUp.cs提示缺失命名空间是正常现象,不需要手动逐个补全程序集引用:既然msbuild已经能返回0错误完成构建,说明所有依赖、引用配置都正确,msbuild会自动处理系统程序集、项目引用、NuGet包的加载逻辑,直接用msbuild产出的bin目录文件即可,不需要手动调用csc编译单个文件。
3. 配置MonoDevelop调用新版Mono
异步返回视图报错的问题是旧版Mono的已知bug,按以下步骤给MonoDevelop指定已合并修复的新版Mono即可:
- 先在终端执行
which mono确认新版Mono的安装路径,再执行mono --version确认版本号符合预期 - 打开MonoDevelop,依次进入顶部菜单「编辑 > 首选项 > 项目 > .NET运行时」
- 点击「添加」按钮,选择新版Mono的安装根目录(即bin文件夹的上一级目录,官方源安装的一般是
/usr,源码编译安装的一般是/usr/local) - 添加完成后在运行时列表选中刚添加的新版Mono,点击「设为默认」
- 重启MonoDevelop后重新加载项目,后续构建、运行都会调用新版Mono,异步视图相关的报错会直接消失
排查注意点
- obj目录下的所有文件都是编译过程生成的临时中间产物,没有运行、部署价值,所有运行、部署操作只需要关注bin目录的正式产出
- .NET Framework 4.8 属于Windows原生框架,确实无法通过跨平台的新版dotnet(.NET Core/.NET 5+)命令行运行,Mono+xsp4是当前Ubuntu环境下的适配方案
- 如果启动xsp4后仍然提示找不到视图,优先检查执行xsp4命令的工作目录是否为项目根目录,确认Views文件夹、Web.config文件在当前工作路径下,且bin目录内的dll文件完整无缺失
内容的提问来源于stack exchange,提问作者dan178
相关产品推荐
相关产品推荐

