mono-6.6.0环境mkbundle打包GTK项目netstandard缺失报错求助
解决方案
1. netstandard程序集加载失败修复
- 你在csproj中添加netstandard引用的操作正确,报错是因为mkbundle默认不会自动打包facade类型的程序集,需要显式指定:
首先确认项目Release输出目录中存在netstandard.dll(你设置了<Private>True</Private>,生成时会自动复制到输出目录,缺失的话可以从mono安装目录或者对应netstandard nuget包中手动拷贝)
调整mkbundle命令,添加--lib参数指向项目输出目录,同时显式引入netstandard.dll:- Windows交叉编译命令:
mkbundle TimeDateCalculator.gtk.exe --simple -o timedatecalculator --cross mono-6.6.0-ubuntu-18 --lib "你的项目Release输出目录绝对路径" netstandard.dll- WSL本地编译命令:
先执行环境变量设置让mono可以找到引用的程序集,再运行打包命令:
export MONO_PATH="你的项目Release输出目录绝对路径" mkbundle -o timedatecalculator --simple TimeDateCalculator.gtk.exe --config /etc/mono/config --machine-config /etc/mono/4.5/machine.config --lib "你的项目Release输出目录绝对路径" netstandard.dll - 额外注意:Windows端交叉编译用的mono交叉工具链版本,需要和WSL中安装的mono版本完全一致,你用的是mono 6.6的交叉包,WSL中不要安装更高版本的mono,避免版本不兼容导致运行时加载失败。
2. gtksharpglue-2 依赖缺失修复
这个错误是mkbundle仅打包托管程序集,不会自动打包GTK#的原生依赖导致的,不需要降级.NET Framework版本,直接改回.NET Framework 4.8即可,按以下步骤处理:
- 先在WSL环境安装完整的GTK#运行依赖:
sudo apt update sudo apt install gtk-sharp2 libgtk2.0-0 xauth - 如果需要制作完全自包含的程序包(无需用户提前安装依赖),需要在mkbundle命令中通过
--native-library参数显式打包所有原生依赖:
先找到libgtksharpglue-2.so的实际路径(一般在/usr/lib/x86_64-linux-gnu/或者/usr/lib/cli/gtk-sharp-2.0/目录下),再修改打包命令添加对应参数,示例:
其他GTK相关原生依赖如果运行时报错也用同样方法添加进去即可,也可以选择将所有用到的.so文件和生成的可执行文件放在同一目录下,运行时会自动加载。mkbundle -o timedatecalculator --simple TimeDateCalculator.gtk.exe --config /etc/mono/config --machine-config /etc/mono/4.5/machine.config --lib "你的项目Release输出目录绝对路径" netstandard.dll --native-library /usr/lib/x86_64-linux-gnu/libgtksharpglue-2.so --native-library /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so
内容的提问来源于stack exchange,提问作者Eigil
相关产品推荐
相关产品推荐

