Ошибка 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 это удовлетворит требование.

Другие вопросы по тегам