mkbundle и GTK # - PullRequest
       42

mkbundle и GTK #

0 голосов
/ 05 сентября 2011

Я пытаюсь использовать mkbundle, чтобы я мог распространять приложение GTK # без необходимости установки .NET / Mono или GTK # пользователями.Я успешно упаковал приложение, которое использует winforms, но по какой-то причине, когда я делаю то же самое с приложением GTK #, оно не будет работать.

Это то, что я получаю из cygwin:

$ mkbundle --deps a.exe OS is: Windows Sources: 1 Auto-dependencies: True

Необработанное исключение: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'gtk-sharp 'или одна из его зависимостей.Системе не удается найти указанный файл.
Имя файла: 'gtk-sharp'
в System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] в:0
at (обертывание-вызов-взаимодействие-с-проверкой) System.AppDomain: Load (System.Reflection.AssemblyName, System.Security.Policy.Evidence)
в System.AppDomain.Load (System.Reflection.AssemblyNameassemblyRef) [0x00000] в: 0
в (обертывание-вызов-связывание с проверкой) System.AppDomain: Load (System.Reflection.AssemblyName)
в System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] в: 0
в MakeBundle.QueueAssembly (файлы System.Collections.ArrayList, кодовая база System.String) [0x00000] в: 0
в MakeBundle.Main (аргументы System.String [])[0x00000] in: 0
[ERROR] FATAL UNHANDLED EXCEPTION: System.IO.FileNotFoundException: Не удалось загрузить файл или сборку 'gtk-sharp' или одну из ее зависимостей.Системе не удается найти указанный файл.
Имя файла: 'gtk-sharp'
в System.AppDomain.Load (System.Reflection.AssemblyName assemblyRef, System.Security.Policy.Evidence assemblySecurity) [0x00000] в:0
at (обертывание-вызов-взаимодействие-с-проверкой) System.AppDomain: Load (System.Reflection.AssemblyName, System.Security.Policy.Evidence)
в System.AppDomain.Load (System.Reflection.AssemblyNameassemblyRef) [0x00000] в: 0
в (обертывание-вызов-связывание с проверкой) System.AppDomain: Load (System.Reflection.AssemblyName)
в System.Reflection.Assembly.Load (System.Reflection.AssemblyName assemblyRef) [0x00000] в: 0
в MakeBundle.QueueAssembly (файлы System.Collections.ArrayList, кодовая база System.String) [0x00000] в: 0
в MakeBundle.Main (аргументы System.String [])[0x00000] in: 0`

Но все же у меня есть /cygdrive/c/GtkSharp/2.12/lib в моей переменной PATH.Я могу проверить это, как будто я набираю "gtk-sharp.dll" в cygwin, и мне возвращается следующее:

$ gtk-sharp.dll bash: /cygdrive/c/GtkSharp/2.12/lib/gtk-sharp-2.0/gtk-sharp.dll: cannot execute binary file

Так что он должен быть в состоянии найти файл!

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 15 мая 2013

Я нашел скрипт оболочки, который делает все это, и изменил его до последних версий, по состоянию на май 2013 года вы можете просто использовать скрипт следующим образом:

https://gist.github.com/tebjan/5581296

1.) Установите cygwin и убедитесь, что вы выбрали следующие пакеты: - GCC-MINGW - pkg-config - mingw-zlib1 - mingw-zlib-devel

2.) Установите пакет выпуска Mono: «Mono для Windows, Gtk # и XSP»

3.) Загрузите скрипт, поместите его помимо вашего Приложения и измените его в соответствии с вашей средой (внимательно прочитайте комментарии в файле).

4.) Откройте cygwin и перейдите к выходной папке вашего приложения, где находятся исполняемый файл и сценарий, например, YourProject / bin / Release

5.) Выполните скрипт с помощью команды: ./mkbundle_cygwin.sh

Поиск и устранение неисправностей: Если ваш встроенный исполняемый файл не работает, убедитесь, что оригинальное приложение .NET работает в режиме моно. Вы можете проверить это, вызвав файл mono.exe и передав ему приложение .NET, или установив XamarinStudio и запустив оттуда свой проект (установите моно как среду выполнения).

1 голос
/ 06 сентября 2011

ОК. Я не знаю, является ли это реальным решением, но я просто скопировал сборки из C: \ GtkSharp \ 2.12 \ lib \ gtk-sharp-2.0 в C: \ Mono-2.10.5 \ lib \ mono\ 4.0 и теперь кажется, что все в порядке, используя следующие шаги:

mkbundle -c -o host.c -oo bundle.o --deps app.exe

nano host.c

изменить следующее с:

#ifdef _WIN32
#include <windows.h>
#endif`

до

#ifdef _WIN32
#include <windows.h>
#endif
#undef _WIN32

И наконец:

gcc -mno-cygwin -o bundled.exe -Wall host.c `pkg-config --cflags --libs mono-2|dos2unix` bundle.o

Это сработало для меня.Хотя мне также для некоторых вещей нужно было скопировать machine.config из C: \ Mono-2.10.5 \ etc \ mono \ 4.0 в каталог, где находится мое приложение, и передать --machine-config machine.config в mkbundle.

...