Ошибка mkbundle System.ComponentModel.Win32Exception
Я пытаюсь связать приложение, которое я сделал в monodevelop на archlinux.
Как только я создаю приложение в monodevelop, я собираюсь создать пакет с помощью следующей команды:
mkbundle --deps file.exe --static
Но вывод:
OS is: Linux
Note that statically linking the LGPL Mono runtime has more licensing restrictions than dynamically linking.
See http://www.mono-project.com/Licensing for details on licensing.
Sources: 1 Auto-dependencies: True
embedding: /home/test/Test/Test/bin/Release/file.exe
embedding: /usr/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f/gtk-sharp.dll
config from: /usr/lib/mono/gac/gtk-sharp/2.12.0.0__35e10195dab3c99f/gtk-sharp.dll.config
embedding: /usr/lib/mono/4.5/mscorlib.dll
embedding: /usr/lib/mono/gac/gdk-sharp/2.12.0.0__35e10195dab3c99f/gdk-sharp.dll
config from: /usr/lib/mono/gac/gdk-sharp/2.12.0.0__35e10195dab3c99f/gdk-sharp.dll.config
embedding: /usr/lib/mono/gac/glib-sharp/2.12.0.0__35e10195dab3c99f/glib-sharp.dll
config from: /usr/lib/mono/gac/glib-sharp/2.12.0.0__35e10195dab3c99f/glib-sharp.dll.config
embedding: /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll
embedding: /usr/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll
embedding: /usr/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
embedding: /usr/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll
embedding: /usr/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll
embedding: /usr/lib/mono/gac/Mono.Cairo/4.0.0.0__0738eb9f132ed756/Mono.Cairo.dll
embedding: /usr/lib/mono/gac/pango-sharp/2.12.0.0__35e10195dab3c99f/pango-sharp.dll
config from: /usr/lib/mono/gac/pango-sharp/2.12.0.0__35e10195dab3c99f/pango-sharp.dll.config
embedding: /usr/lib/mono/gac/atk-sharp/2.12.0.0__35e10195dab3c99f/atk-sharp.dll
config from: /usr/lib/mono/gac/atk-sharp/2.12.0.0__35e10195dab3c99f/atk-sharp.dll.config
embedding: /usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll
Compiling:
AS = as (default)
as -o temp.o temp.s
as -o temp.o temp.s
Unhandled Exception:
System.ComponentModel.Win32Exception: ApplicationName='cmd', CommandLine='/c "as -o temp.o temp.s "', CurrentDirectory='', Native error= Cannot find the specified file
at System.Diagnostics.Process.Start_noshell (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) <0x40c2f420 + 0x00637> in <filename unknown>:0
[ERROR] FATAL UNHANDLED EXCEPTION: System.ComponentModel.Win32Exception: ApplicationName='cmd', CommandLine='/c "as -o temp.o temp.s "', CurrentDirectory='', Native error= Cannot find the specified file
at System.Diagnostics.Process.Start_noshell (System.Diagnostics.ProcessStartInfo startInfo, System.Diagnostics.Process process) <0x40c2f420 + 0x00637> in <filename unknown>:0
Поскольку я статически связываю моно, мне нужно было установить моногит из AUR, чтобы убедиться, что у меня есть статические библиотеки.
Я также не уверен, почему у него есть два as -o temp.o temp.s
в списке.
Любая помощь будет оценена.
РЕДАКТИРОВАТЬ 23 ноября: я только что подтвердил, что as
а также cc
были установлены. Выход версии находится по адресу: http://pastebin.com/ka25tjWZ
РЕДАКТИРОВАТЬ 24NOV: Как объяснено в принятом ответе; мой моно не был правильно скомпилирован. Я перестроил, используя abs со следующим PKGBUILD, и теперь он работает как положено.
# $Id: PKGBUILD 246414 2015-09-16 21:25:15Z daniel $
# Maintainer: Daniel Isenmann <daniel@archlinux.org>
# Contributor: Brice Carpentier <brice@dlfp.org>
pkgname=mono
pkgver=4.0.4.1
_pkgver=4.0.4
pkgrel=1
pkgdesc="Free implementation of the .NET platform including runtime and compiler"
arch=(i686 x86_64)
license=('GPL' 'LGPL2.1' 'MPL' 'custom:MITX11')
url="http://www.mono-project.com/"
depends=('zlib' 'libgdiplus>=3.8' 'sh' 'python' 'ca-certificates')
options=('!makeflags' 'staticlibs')
provides=('monodoc')
conflicts=('monodoc')
source=(http://download.mono-project.com/sources/mono/${pkgname}-${pkgver}.tar.bz2
mono.binfmt.d
sgen_fix.patch
build_fix.patch
Microsoft.Portable.Common.targets
fix-zlib-helper.patch)
md5sums=('f598b60a664dfebb1a5eef3e66a9a178'
'b9ef8a65fea497acf176cca16c1e2402'
'8a700b94bff7a913f920e95890d2fb4c'
'30a5af1a4ff50b98f9e73cc2ae554115'
'acbffadb0ac233c494b40dd5e79209a5'
'62912ad289535bf841c140727e5c1165')
install="${pkgname}.install"
build() {
cd "${srcdir}"/${pkgname}-${_pkgver}
# build mono
./configure --prefix=/usr \
--sysconfdir=/etc \
--bindir=/usr/bin \
--sbindir=/usr/bin \
--disable-quiet-build \
--disable-system-aot \
--enable-static \
--with-static_mono=yes \
--with-mcs-docs=no
make
# build jay
cd "${srcdir}"/${pkgname}-${_pkgver}/mcs/jay
make
}
package() {
cd "${srcdir}"/${pkgname}-${_pkgver}
make DESTDIR="${pkgdir}" install
# install jay
pushd "${srcdir}"/${pkgname}-${_pkgver}/mcs/jay
make DESTDIR="${pkgdir}" prefix=/usr INSTALL=../../install-sh install
popd
# install binfmt conf file and pathes
install -D -m644 "${srcdir}"/mono.binfmt.d "${pkgdir}"/usr/lib/binfmt.d/mono.conf
#install license
mkdir -p "${pkgdir}"/usr/share/licenses/${pkgname}
install -m644 mcs/MIT.X11 "${pkgdir}"/usr/share/licenses/${pkgname}/
#fix .pc file to be able to request mono on what it depends, fixes #go-oo build
sed -i -e "s:#Requires:Requires:" "${pkgdir}"/usr/lib/pkgconfig/mono.pc
}
1 ответ
Обновить:
Так что я ssh'd ArchLinux друга и mkbundle
там нормально работает, поэтому я вернулся к вашей ошибке:
System.ComponentModel.Win32Exception: ApplicationName = 'cmd', CommandLine = '/ c "as -o temp.o temp.s", CurrentDirectory='', собственная ошибка = Не удается найти указанный файл в System.Diagnostics.Process.Start_noshell
Первоначально я думал, что вы находитесь в Windows из-за этой ошибки, но вы сказали, что Linux, поэтому я проигнорировал это. Я пошел к источнику mkbundle
и я вижу, что ваш пакет ArchLinux и / или установка Mono неправильно сообщает об IsUnix как false
и, следовательно, он не выполняет AS cmd через system
звонить, но пытается использовать Windows cmd
выполнить его и, следовательно, не удается....
static bool IsUnix {
get {
int p = (int) Environment.OSVersion.Platform;
return ((p == 4) || (p == 128) || (p == 6));
}
}
static void Execute (string cmdLine)
{
if (IsUnix) {
Console.WriteLine (cmdLine);
int ret = system (cmdLine);
if (ret != 0)
{
Опять же, ArchLinux 4.2.5-1, к которому у меня есть доступ, имеет Mono 4.0.4.1 и работает как положено.....
Что возвращается в вашей системе для каждой из этих строк?:
int p = (int) Environment.OSVersion.Platform;
var islinux = ((p == 4) || (p == 128) || (p == 6));
Оригинал:
ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫ
AS Assembler command. The default is "as". CC C compiler command. The default is "cc" under Linux and "gcc" under Windows.
Ref: man mkbundle
Это то же самое требование, что и вам, если бы вы строили моно, кроме temp.s
ассемблерный код, который он также создаст temp.c
файл, который требует компилятора переменного тока. Это код начальной загрузки для загрузки / исполнения кода на основе CIL.
Если вам не хватает ассемблера в вашей системе, существует ряд пакетов, таких как binutils
это удовлетворит требование.